/* * 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 . */ static const char rcsid[] = "@(#) raslib, r_Attribute: $Header: /home/rasdev/CVS-repository/rasdaman/raslib/attribute.cc,v 1.11 2003/12/27 23:01:21 rasdev Exp $"; #include "raslib/attribute.hh" #include "raslib/basetype.hh" #include "raslib/structuretype.hh" #include "raslib/rminit.hh" #include "raslib/error.hh" r_Attribute::r_Attribute() : r_Property(), localOffset(0), globalOffset(0) { } r_Attribute::r_Attribute(const char* newTypeName, const r_Base_Type& newType) : r_Property(newTypeName, newType), localOffset(0), globalOffset(0) { } r_Attribute::r_Attribute(const r_Attribute& oldObj) : r_Property(oldObj) , localOffset(oldObj.localOffset), globalOffset(oldObj.globalOffset) { } const r_Attribute& r_Attribute::operator=(const r_Attribute& oldObj) { // Gracefully handle self assignment if (this != &oldObj) { r_Property::operator=(oldObj) ; localOffset = oldObj.localOffset; globalOffset = oldObj.globalOffset; } return *this; } r_Attribute::~r_Attribute() { } r_Bytes r_Attribute::offset() const { return localOffset; } void r_Attribute::set_offset(r_Bytes newOffset) { localOffset = newOffset; } r_Bytes r_Attribute::global_offset() const { return globalOffset; } void r_Attribute::set_global_offset(r_Bytes newOffset) { globalOffset = newOffset; } void r_Attribute::print_status(std::ostream& s) const { type_of().print_status(s); s << " " << name() << std::flush; } r_Attribute r_Attribute::operator[](unsigned int number) const throw(r_Error) { if (type_of().type_id() != r_Type::STRUCTURETYPE) { RMInit::logOut << "r_Attribute::operator[](" << number << ") not a struct type" << endl; throw r_Error(r_Error::r_Error_TypeInvalid) ; } const r_Structure_Type& structValue = (const r_Structure_Type&)type_of(); return structValue[number]; } r_Boolean r_Attribute::get_boolean(const char* cell) const throw(r_Error) { if (type_of().type_id() != r_Type::BOOL) { RMInit::logOut << "r_Attribute::get_boolean(data) not a boolean" << endl; r_Error err(r_Error::r_Error_TypeInvalid) ; throw(err) ; } return *((r_Boolean*) (cell+globalOffset) ) ; } r_Char r_Attribute::get_char(const char* cell) const throw(r_Error) { if (type_of() .type_id() != r_Type::CHAR) { RMInit::logOut << "r_Attribute::get_char(data) not a char" << endl; r_Error err(r_Error::r_Error_TypeInvalid) ; throw(err) ; } return *((r_Char*) (cell+globalOffset) ) ; } r_Octet r_Attribute::get_octet(const char* cell) const throw(r_Error) { if (type_of() .type_id() != r_Type::OCTET) { RMInit::logOut << "r_Attribute::get_octet(data) not a octet" << endl; r_Error err(r_Error::r_Error_TypeInvalid) ; throw(err) ; } return *((r_Octet*) (cell+globalOffset) ) ; } r_Short r_Attribute::get_short(const char* cell) const throw(r_Error) { if (type_of() .type_id() != r_Type::SHORT) { RMInit::logOut << "r_Attribute::get_short(data) not a short" << endl; r_Error err(r_Error::r_Error_TypeInvalid) ; throw(err) ; } return *((r_Short*) (cell+globalOffset) ) ; } r_UShort r_Attribute::get_ushort(const char* cell) const throw(r_Error) { if (type_of() .type_id() != r_Type::USHORT) { RMInit::logOut << "r_Attribute::get_ushort(data) not a ushort" << endl; r_Error err(r_Error::r_Error_TypeInvalid) ; throw(err) ; } return *((r_UShort*) (cell+globalOffset) ) ; } r_Long r_Attribute::get_long(const char* cell) const throw(r_Error) { if (type_of() .type_id() != r_Type::LONG) { RMInit::logOut << "r_Attribute::get_long(data) not a long" << endl; r_Error err(r_Error::r_Error_TypeInvalid) ; throw(err) ; } return *((r_Long*) (cell+globalOffset) ) ; } r_ULong r_Attribute::get_ulong(const char* cell) const throw(r_Error) { if (type_of() .type_id() != r_Type::ULONG) { RMInit::logOut << "r_Attribute::get_ulong(data) not a ulong" << endl; r_Error err(r_Error::r_Error_TypeInvalid) ; throw(err) ; } return *((r_ULong*) (cell+globalOffset) ) ; } r_Float r_Attribute::get_float(const char* cell) const throw(r_Error) { if (type_of() .type_id() != r_Type::FLOAT) { RMInit::logOut << "r_Attribute::get_float(data) not a float" << endl; r_Error err(r_Error::r_Error_TypeInvalid) ; throw(err) ; } return *((r_Float*) (cell+globalOffset) ) ; } r_Double r_Attribute::get_double(const char* cell) const throw(r_Error) { if (type_of() .type_id() != r_Type::DOUBLE) { RMInit::logOut << "r_Attribute::get_double(data) not a double" << endl; r_Error err(r_Error::r_Error_TypeInvalid) ; throw(err) ; } return *((r_Double*) (cell+globalOffset) ) ; } std::ostream &operator<<( std::ostream &str, const r_Attribute &type ) { type.print_status(str); return str; }