/*
* 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: primitive.cc
*
* MODULE: raslib
* CLASS: r_Primitive
*
* COMMENTS:
*
*/
#include "mymalloc/mymalloc.h"
#include "raslib/primitive.hh"
#include "raslib/primitivetype.hh"
#include "raslib/rminit.hh"
#include "raslib/error.hh"
#ifdef __VISUALC__
#include
#else
#include
#endif
#include
#include
#include
r_Primitive::r_Primitive( const char* newBuffer, const r_Primitive_Type* newType )
: r_Scalar( newType )
{
if( valueType )
{
valueBuffer = (char*)mymalloc( valueType->size() );
if( newBuffer)
memcpy( (void*)valueBuffer, (void*)newBuffer, valueType->size() );
else
memset( (void*)valueBuffer, 0, valueType->size() );
}
}
r_Primitive::r_Primitive( const r_Primitive& obj )
: r_Scalar( obj ),
valueBuffer(NULL)
{
valueBuffer = (char*)mymalloc( valueType->size() );
if( obj.valueBuffer )
memcpy( (void*)valueBuffer, (void*)obj.valueBuffer, valueType->size() );
else
memset( (void*)valueBuffer, 0, valueType->size());
}
r_Primitive::~r_Primitive()
{
if( valueBuffer ) free( valueBuffer );
}
bool
r_Primitive::isPrimitive() const
{
return true;
}
r_Scalar*
r_Primitive::clone() const
{
return new r_Primitive( *this );
}
const r_Primitive&
r_Primitive::operator=( const r_Primitive& obj )
{
if( this != &obj )
{
// assign scalar
r_Scalar::operator=( obj );
if( valueBuffer )
{
free( valueBuffer );
valueBuffer = NULL;
}
if( valueType )
{
valueBuffer = (char*)mymalloc( valueType->size() );
if( obj.valueBuffer )
memcpy( (void*)valueBuffer, (void*)obj.valueBuffer, valueType->size() );
else
memset((void*)valueBuffer, 0, valueType->size());
}
}
return *this;
}
const char*
r_Primitive::get_buffer() const
{
return valueBuffer;
}
void
r_Primitive::print_status( std::ostream& s ) const
{
if( valueType && valueBuffer )
valueType->print_value( valueBuffer, s );
else
s << "" << std::flush;
}
r_Boolean
r_Primitive::get_boolean() const throw( r_Error )
{
if( !valueBuffer || !valueType )
{
RMInit::logOut << "r_Primitive::get_boolean() buffer null or type null " << endl;
r_Error err( r_Error::r_Error_TypeInvalid );
throw err;
}
return ((r_Primitive_Type*)valueType)->get_boolean(valueBuffer);
}
r_Char
r_Primitive::get_char() const throw( r_Error )
{
if( !valueBuffer || !valueType)
{
RMInit::logOut << "r_Primitive::get_char() buffer null or type null" << endl;
r_Error err( r_Error::r_Error_TypeInvalid );
throw err;
}
return ((r_Primitive_Type*)valueType)->get_char(valueBuffer);
}
r_Octet
r_Primitive::get_octet() const throw( r_Error )
{
if( !valueBuffer || !valueType )
{
RMInit::logOut << "r_Primitive::get_octet() buffer null or type null" << endl;
r_Error err( r_Error::r_Error_TypeInvalid );
throw err;
}
return ((r_Primitive_Type*)valueType)->get_octet(valueBuffer);
}
r_Short
r_Primitive::get_short() const throw( r_Error )
{
if( !valueBuffer || !valueType )
{
RMInit::logOut << "r_Primitive::get_short() buffer null or type null" << endl;
r_Error err( r_Error::r_Error_TypeInvalid );
throw err;
}
return ((r_Primitive_Type*)valueType)->get_short(valueBuffer);
}
r_UShort
r_Primitive::get_ushort() const throw( r_Error )
{
if( !valueBuffer || !valueType )
{
RMInit::logOut << "r_Primitive::get_ushort() buffer null or type null" << endl;
r_Error err( r_Error::r_Error_TypeInvalid );
throw err;
}
return ((r_Primitive_Type*)valueType)->get_ushort(valueBuffer);
}
r_Long
r_Primitive::get_long() const throw( r_Error )
{
if( !valueBuffer || !valueType )
{
RMInit::logOut << "r_Primitive::get_long() buffer null or type null" << endl;
r_Error err( r_Error::r_Error_TypeInvalid );
throw err;
}
return ((r_Primitive_Type*)valueType)->get_long(valueBuffer);
}
r_ULong
r_Primitive::get_ulong() const throw( r_Error )
{
if( !valueBuffer || !valueType )
{
RMInit::logOut << "r_Primitive::get_ulong() buffer null or type null" << endl;
r_Error err( r_Error::r_Error_TypeInvalid );
throw err;
}
return ((r_Primitive_Type*)valueType)->get_ulong(valueBuffer);
}
r_Float
r_Primitive::get_float() const throw( r_Error )
{
if( !valueBuffer || !valueType )
{
RMInit::logOut << "r_Primitive::get_float() buffer null or type null" << endl;
r_Error err( r_Error::r_Error_TypeInvalid );
throw err;
}
return ((r_Primitive_Type*)valueType)->get_float(valueBuffer);
}
r_Double
r_Primitive::get_double() const throw( r_Error )
{
if( !valueBuffer || !valueType )
{
RMInit::logOut << "r_Primitive::get_double() buffer null or type null" << endl;
r_Error err( r_Error::r_Error_TypeInvalid );
throw err;
}
return ((r_Primitive_Type*)valueType)->get_double(valueBuffer);
}
void
r_Primitive::set_boolean(r_Boolean val) throw( r_Error )
{
if( !valueType || valueType->type_id() != r_Type::BOOL )
{
RMInit::logOut << "r_Primitive::set_boolean(" << val << ") not a boolean" << endl;
r_Error err( r_Error::r_Error_TypeInvalid );
throw err;
}
if( !valueBuffer )
valueBuffer = (char*)mymalloc( valueType->size());
memmove(valueBuffer, &val, valueType->size());
}
void
r_Primitive::set_char(r_Char val) throw( r_Error )
{
if( !valueType || valueType->type_id() != r_Type::CHAR )
{
RMInit::logOut << "r_Primitive::set_char(" << val << ") not a char" << endl;
r_Error err( r_Error::r_Error_TypeInvalid );
throw err;
}
if( !valueBuffer )
valueBuffer = (char*)mymalloc( valueType->size());
memmove(valueBuffer, &val, valueType->size());
}
void
r_Primitive::set_octet(r_Octet val) throw( r_Error )
{
if( !valueType || valueType->type_id() != r_Type::OCTET )
{
RMInit::logOut << "r_Primitive::set_octet(" << val << ") not a octet" << endl;
r_Error err( r_Error::r_Error_TypeInvalid );
throw err;
}
if( !valueBuffer )
valueBuffer = (char*)mymalloc( valueType->size());
memmove(valueBuffer, &val, valueType->size());
}
void
r_Primitive::set_short(r_Short val) throw( r_Error )
{
if( !valueType || valueType->type_id() != r_Type::SHORT )
{
RMInit::logOut << "r_Primitive::set_short(" << val << ") not a short" << endl;
r_Error err( r_Error::r_Error_TypeInvalid );
throw err;
}
if( !valueBuffer )
valueBuffer = (char*)mymalloc( valueType->size());
memmove(valueBuffer, &val, valueType->size());
}
void
r_Primitive::set_ushort(r_UShort val) throw( r_Error )
{
if( !valueType || valueType->type_id() != r_Type::USHORT )
{
RMInit::logOut << "r_Primitive::set_ushort(" << val << ") not a ushort" << endl;
r_Error err( r_Error::r_Error_TypeInvalid );
throw err;
}
if( !valueBuffer )
valueBuffer = (char*)mymalloc( valueType->size());
memmove(valueBuffer, &val, valueType->size());
}
void
r_Primitive::set_long(r_Long val) throw( r_Error )
{
if( !valueType || valueType->type_id() != r_Type::LONG )
{
RMInit::logOut << "r_Primitive::set_long(" << val << ") not a long" << endl;
r_Error err( r_Error::r_Error_TypeInvalid );
throw err;
}
if( !valueBuffer )
valueBuffer = (char*)mymalloc( valueType->size());
memmove(valueBuffer, &val, valueType->size());
}
void
r_Primitive::set_ulong(r_ULong val) throw( r_Error )
{
if( !valueType || valueType->type_id() != r_Type::ULONG )
{
RMInit::logOut << "r_Primitive::set_ulong(" << val << ") not a ulong" << endl;
r_Error err( r_Error::r_Error_TypeInvalid );
throw err;
}
if( !valueBuffer )
valueBuffer = (char*)mymalloc( valueType->size());
memmove(valueBuffer, &val, valueType->size());
}
void
r_Primitive::set_float(r_Float val) throw( r_Error )
{
if( !valueType || valueType->type_id() != r_Type::FLOAT )
{
RMInit::logOut << "r_Primitive::set_float(" << val << ") not a float" << endl;
r_Error err( r_Error::r_Error_TypeInvalid );
throw err;
}
if( !valueBuffer )
valueBuffer = (char*)mymalloc( valueType->size());
memmove(valueBuffer, &val, valueType->size());
}
void
r_Primitive::set_double(r_Double val) throw( r_Error )
{
if( !valueType || valueType->type_id() != r_Type::DOUBLE )
{
RMInit::logOut << "r_Primitive::set_double(" << val << ") not a double" << endl;
r_Error err( r_Error::r_Error_TypeInvalid );
throw err;
}
if( !valueBuffer )
valueBuffer = (char*)mymalloc( valueType->size());
memmove(valueBuffer, &val, valueType->size());
}
std::ostream& operator<<( std::ostream& s, const r_Primitive& obj )
{
obj.print_status( s );
return s;
}