/* * This file is part of rasdaman community. * * Rasdaman community is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Rasdaman community is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with rasdaman community. If not, see . * * Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009 Peter Baumann / rasdaman GmbH. * * For more information please see * or contact Peter Baumann via . */ /************************************************************* * * SOURCE: test_metaobject.cc * * MODULE: raslib * * PURPOSE: * * * COMMENTS: * ************************************************************/ #include #ifdef __VISUALC__ #define __EXECUTABLE__ #include "raslib/itertype.hh" #include "raslib/structuretype.hh" #include "raslib/attribute.hh" #include "raslib/primitivetype.hh" #include "raslib/rminit.hh" #include "raslib/basetype.hh" #include "raslib/marraytype.hh" #undef __EXECUTABLE__ #else #include "raslib/itertype.hh" #include "raslib/structuretype.hh" #include "raslib/attribute.hh" #include "raslib/primitivetype.hh" #include "raslib/rminit.hh" #include "raslib/basetype.hh" #include "raslib/marraytype.hh" #endif #include "raslib/error.hh" #include "raslib/type.hh" #include "raslib/structure.hh" #include "raslib/primitive.hh" RMINITGLOBALS('C') void testType( const char* stringType ) { r_Type* type = NULL; cout << "Create " << stringType << endl; try { type = r_Type::get_any_type( stringType ); } catch( r_Error& errorObj ) { cout << errorObj.what() << endl << endl; } cout << " Type: "; if( type ) { type->print_status( cout ); cout << endl; cout << type->type_id() << endl; } else { cout << "" << endl; } cout << endl; delete type; } /* void testEndian() { r_Primitive_Type boolType("Bool", r_Primitive_Type::BOOL); r_Primitive_Type shortType("Short", r_Primitive_Type::SHORT); r_Primitive_Type uLongType("ULong", r_Primitive_Type::ULONG); r_Type* structType; structType = r_Type::get_any_type( "struct{bool e1, short e2, ulong e3}" ); char cChar = 47; short cShort = 1065; unsigned long cULong = 92753; char *boolCell = (char*)&cChar; char *shortCell = (char*)&cShort; char *uLongCell = (char*)&cULong; char structCell[7] = { 1, 2, 3, 4, 5, 6, 7 }; cout << "Before convertToLittleEndian:" << endl; cout << "Char: " << (long)*boolCell << endl << "Short: " << (long)*shortCell << " " << (long)*(shortCell+1) << endl << "ULong: " << (long)*uLongCell << " " << (long)*(uLongCell+1) << " " << (long)*(uLongCell+2) << " " << (long)*(uLongCell+3) << endl << "Struct: " << (long)*structCell << " " << (long)*(structCell+1) << " " << (long)*(structCell+2) << " " << (long)*(structCell+3) << " " << (long)*(structCell+4) << " " << (long)*(structCell+5) << " " << (long)*(structCell+6) << " " << endl; boolType.convertToLittleEndian(boolCell, 1); shortType.convertToLittleEndian(shortCell, 1); uLongType.convertToLittleEndian(uLongCell, 1); structType->convertToLittleEndian(structCell, 1); cout << "After convertToLittleEndian:" << endl; cout << "Char: " << (long)*boolCell << endl << "Short: " << (long)*shortCell << " " << (long)*(shortCell+1) << endl << "ULong: " << (long)*uLongCell << " " << (long)*(uLongCell+1) << " " << (long)*(uLongCell+2) << " " << (long)*(uLongCell+3) << endl << "Struct: " << (long)*structCell << " " << (long)*(structCell+1) << " " << (long)*(structCell+2) << " " << (long)*(structCell+3) << " " << (long)*(structCell+4) << " " << (long)*(structCell+5) << " " << (long)*(structCell+6) << " " << endl; boolType.convertToBigEndian(boolCell, 1); shortType.convertToBigEndian(shortCell, 1); uLongType.convertToBigEndian(uLongCell, 1); structType->convertToLittleEndian(structCell, 1); cout << "After convertToBigEndian:" << endl; cout << "Char: " << (long)*boolCell << endl << "Short: " << (long)*shortCell << " " << (long)*(shortCell+1) << endl << "ULong: " << (long)*uLongCell << " " << (long)*(uLongCell+1) << " " << (long)*(uLongCell+2) << " " << (long)*(uLongCell+3) << endl << "Struct: " << (long)*structCell << " " << (long)*(structCell+1) << " " << (long)*(structCell+2) << " " << (long)*(structCell+3) << " " << (long)*(structCell+4) << " " << (long)*(structCell+5) << " " << (long)*(structCell+6) << " " << endl; delete structType; } */ int main() { cout << "Creating definining primitive types ..." << endl; r_Primitive_Type myBool("Bool", r_Primitive_Type::BOOL); myBool.print_status( cout ); cout << endl; r_Primitive_Type myULong("ULong", r_Primitive_Type::ULONG); myULong.print_status( cout ); cout << endl; r_Primitive_Type tmp = myBool; tmp.print_status( cout ); cout << endl; r_Attribute tmpAtt("tmpAtt",tmp ); tmpAtt.print_status( cout ); cout << endl; cout << "Creating a struct out of them ..." << endl; r_Attribute myAttrs[2]; myAttrs[0] = r_Attribute("Attr1", myBool ); myAttrs[1] = r_Attribute("Attr2", myULong ); r_Structure_Type myStruct("aStruct", 2, myAttrs); myStruct.print_status( cout ); cout << endl; cout << "Iterating attributes of struct:" << endl; r_Structure_Type::attribute_iterator iter(myStruct.defines_attribute_begin()); while(iter != myStruct.defines_attribute_end()) { cout << " Name of Attribute: " << (*iter).name() << endl; cout << " Offset of Attribute: " << (*iter).offset() << endl; cout << " Size of type of Attribute: " << (*iter).type_of().size() << endl; cout << " Name of type of Attribute: " << (*iter).type_of().name() << endl; ++iter; } testType("char"); testType("octet"); testType("short"); testType("ushort"); testType("long"); testType("ulong"); testType("bool"); testType("float"); testType("double"); testType("struct{ char }"); testType("struct{ char band1 }"); testType("struct{ char, octet, ulong, short }"); testType("struct{ char elem1, octet elem2, ulong elem3, short elem4 }"); testType("struct{ char red, char green, char blue }" ); testType("struct{char red, char green, char blue}" ); testType("struct{ struct{ char, char, char }, ulong }"); testType("struct{ struct{ char elem1, char elem2, char elem3 } record, ulong value }"); testType("marray< char >"); testType("marray< char green>"); testType("marray< struct{ char red} >"); testType("marray< struct{char red, char green, char blue} >" ); testType("set< marray< char > >"); testType("set< marray< struct{ char red, char green, char blue } > >" ); testType("interval"); testType("minterval"); testType("point"); testType("oid"); testType("set< interval >"); testType("set< minterval >"); testType("set< point >"); testType("set< oid >"); /* shouldn't work */ cout << endl << "Testing combinations which are not allowed..." << endl; testType("set< marray< interval > >"); testType("set< marray< minterval > >"); testType("set< marray< point > >"); testType("set< marray< oid > >"); testType("interval > >"); testType("interval"); testType("set< marray{ char > >"); testType("struct"); r_Type* type = NULL; char* stringType = "marray< char blue>"; cout << "Create " << stringType << endl; try { type = r_Type::get_any_type( stringType ); } catch( r_Error& errorObj ) { cout << errorObj.what() << endl << endl; } cout << " Type: "; if( type ) { type->print_status( cout ); } else { cout << "" << endl; } cout << endl; // cout << ((r_Marray_Type*)type)->getBaseType() << endl; cout << "Erzeugen einer Kopie und Ausgabe..." << endl; r_Marray_Type my_marray; my_marray = *((r_Marray_Type*)(type)); my_marray.print_status( cout ); cout << endl; // cout << my_marray.getBaseType() << endl; delete type; r_Type* type2 = r_Type::get_any_type("struct{ short band1, char band2 }"); if( type2->isBaseType() ) { r_Base_Type* baseType2 = (r_Base_Type*)type2; cout << "Type: " << flush; baseType2->print_status(); cout << endl; cout << "Size: " << baseType2->size() << endl; } struct structType{ short band1r; char band2i; }; structType structValue = { 1, 2 }; r_Structure structObject( (const char*)&structValue, (const r_Structure_Type*)type2 ); structObject.print_status( cout ); cout << endl; delete type2; /* testEndian(); */ return 0; }