/* * 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 . */ /************************************************************* * * * COMMENTS: * ************************************************************/ static const char rcsid[] = "@(#)qlparser, QtAtomicData: $Header: /home/rasdev/CVS-repository/rasdaman/qlparser/qtatomicdata.cc,v 1.18 2003/12/27 20:51:28 rasdev Exp $"; #include "qlparser/qtatomicdata.hh" #include "relcatalogif/basetype.hh" #include "relcatalogif/alltypes.hh" #include #ifndef CPPSTDLIB #include // STL #else #include using namespace std; #endif #include #include "raslib/rmdebug.hh" QtAtomicData::QtAtomicData() : QtScalarData() { } QtAtomicData::QtAtomicData( r_Long value, unsigned short byteLength ) : QtScalarData() { switch( byteLength ) { case 1: valueType = TypeFactory::mapType("Octet"); break; case 2: valueType = TypeFactory::mapType("Short"); break; case 4: valueType = TypeFactory::mapType("Long"); break; default: RMInit::logOut << "Error: QtAtomicData::QtAtomicData() - signed integer value with length " << byteLength << " is not supported." << endl; } if( valueType ) { r_Long temp = value; valueBuffer = new char[ valueType->getSize() ]; valueType->makeFromCLong( valueBuffer, &temp ); } } QtAtomicData::QtAtomicData( r_ULong value, unsigned short byteLength ) : QtScalarData() { switch( byteLength ) { case 1: valueType = TypeFactory::mapType("Char"); break; case 2: valueType = TypeFactory::mapType("UShort"); break; case 4: valueType = TypeFactory::mapType("ULong"); break; default: RMInit::logOut << "Error: QtAtomicData::QtAtomicData() - unsigned integer value with length " << byteLength << " is not supported." << endl; } if( valueType ) { r_ULong temp = value; valueBuffer = new char[ valueType->getSize() ]; valueType->makeFromCULong( valueBuffer, &temp ); } } QtAtomicData::QtAtomicData( bool value ) : QtScalarData() { r_ULong valueULong = (r_ULong)value; valueType = TypeFactory::mapType("Bool"); valueBuffer = new char[ valueType->getSize() ]; valueType->makeFromCULong( valueBuffer, &valueULong ); } QtAtomicData::QtAtomicData( double value, unsigned short byteLength ) : QtScalarData() { switch( byteLength ) { case 4: valueType = TypeFactory::mapType("Float"); break; case 8: valueType = TypeFactory::mapType("Double"); break; default: RMInit::logOut << "Error: QtAtomicData::QtAtomicData() - float value with length " << byteLength << " is not supported." << endl; } if( valueType ) { valueBuffer = new char[ valueType->getSize() ]; valueType->makeFromCDouble( valueBuffer, &value ); } } QtAtomicData::QtAtomicData( const QtAtomicData& obj ) : QtScalarData( obj ) { } QtAtomicData::~QtAtomicData() { } r_ULong QtAtomicData::getUnsignedValue() const { r_ULong value=0; if( valueType ) valueType->convertToCULong( valueBuffer, &value ); return value; } r_Long QtAtomicData::getSignedValue() const { r_Long value=0; if( valueType ) valueType->convertToCLong( valueBuffer, &value ); return value; } double QtAtomicData::getDoubleValue() const { double value=0; if( valueType ) valueType->convertToCDouble( valueBuffer, &value ); return value; } void QtAtomicData::printStatus( ostream& stream ) const { stream << "atomic, " << flush; QtScalarData::printStatus( stream ); } // for complex types QtAtomicData::QtAtomicData(double valRe, double valIm, unsigned short size) : QtScalarData() { double dummyRe = valRe; double dummyIm = valIm; if(size == 2 * sizeof(float)) valueType = TypeFactory::mapType("Complex1"); else valueType = TypeFactory::mapType("Complex2"); valueBuffer = new char[valueType->getSize()]; valueType->makeFromCDouble(valueBuffer + ((GenericComplexType *)valueType)->getReOffset(), &dummyRe); valueType->makeFromCDouble(valueBuffer + ((GenericComplexType *)valueType)->getImOffset(), &dummyIm); }