summaryrefslogtreecommitdiffstats
path: root/raslib/complextype.cc
diff options
context:
space:
mode:
Diffstat (limited to 'raslib/complextype.cc')
-rw-r--r--raslib/complextype.cc284
1 files changed, 284 insertions, 0 deletions
diff --git a/raslib/complextype.cc b/raslib/complextype.cc
new file mode 100644
index 0000000..e2b59b3
--- /dev/null
+++ b/raslib/complextype.cc
@@ -0,0 +1,284 @@
+/*
+* 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 <http://www.gnu.org/licenses/>.
+*
+* Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009 Peter Baumann /
+rasdaman GmbH.
+*
+* For more information please see <http://www.rasdaman.org>
+* or contact Peter Baumann via <baumann@rasdaman.com>.
+*/
+
+#include <iomanip>
+#include <string>
+#include <cstring>
+
+#include "raslib/complextype.hh"
+#include "raslib/endian.hh"
+#include "raslib/rmdebug.hh"
+#include "raslib/error.hh"
+
+r_Complex_Type::r_Complex_Type()
+ : r_Primitive_Type(),
+ imOff(0)
+ {
+ }
+
+r_Complex_Type::r_Complex_Type(const char* newTypeName, const r_Type::r_Type_Id newTypeId)
+ : r_Primitive_Type(newTypeName, newTypeId)
+ {
+ imOff = 0;
+ switch (typeId)
+ {
+ case COMPLEXTYPE1:
+ imOff = sizeof(r_Float);
+ break;
+ case COMPLEXTYPE2:
+ imOff = sizeof(r_Double);
+ break;
+ default:
+ RMDBGONCE(3, RMDebug::module_raslib, "r_Complex_Type", "r_Complex_Type(...) bad typeId " << typeId);
+ break;
+ }
+ }
+
+r_Complex_Type::~r_Complex_Type()
+ {
+ }
+
+r_Complex_Type::r_Complex_Type(const r_Complex_Type& oldObj)
+ : r_Primitive_Type(oldObj),
+ imOff(oldObj.imOff)
+ {
+ }
+
+const r_Complex_Type&
+r_Complex_Type::operator=(const r_Complex_Type& oldObj)
+ {
+ if (this == &oldObj)
+ return *this;
+
+ r_Primitive_Type::operator =(oldObj);
+ imOff = oldObj.imOff;
+ return *this;
+ }
+
+r_Type*
+r_Complex_Type::clone() const
+ {
+ return new r_Complex_Type(*this);
+ }
+
+r_Double
+ r_Complex_Type::get_re(const char* cell) const throw(r_Error)
+ {
+ double res = 0;
+
+ if( (typeId != r_Type::COMPLEXTYPE1) &&
+ (typeId != r_Type::COMPLEXTYPE2) )
+ {
+ RMInit::logOut << "r_Complex_Type::get_re(cell) type not a complex1 or complex2" << endl;
+ r_Error err( r_Error::r_Error_TypeInvalid );
+ throw( err );
+ }
+
+
+ switch (typeId)
+ {
+ case COMPLEXTYPE1:
+ res = *(r_Float*)cell;
+ break;
+ case COMPLEXTYPE2:
+ res = *(r_Double *)cell;
+ break;
+ default:
+ RMDBGONCE(3, RMDebug::module_raslib, "r_Complex_Type", "get_re(...) bad typeId " << typeId);
+ break;
+ }
+ return res;
+ }
+
+r_Double
+r_Complex_Type::get_im(const char* cell) const throw(r_Error)
+ {
+ double res = 0;
+
+ if( (typeId != r_Type::COMPLEXTYPE1) &&
+ (typeId != r_Type::COMPLEXTYPE2) )
+ {
+ RMInit::logOut << "r_Complex_Type::get_im(cell) type not a complex1 or complex2" << endl;
+ r_Error err( r_Error::r_Error_TypeInvalid );
+ throw( err );
+ }
+
+ switch (typeId)
+ {
+ case COMPLEXTYPE1:
+ res = *(r_Float*)(cell + imOff);
+ break;
+ case COMPLEXTYPE2:
+ res = *(r_Double*)(cell + imOff);
+ break;
+ default:
+ RMDBGONCE(3, RMDebug::module_raslib, "r_Complex_Type", "get_im(...) bad typeId " << typeId);
+ break;
+ }
+ return res;
+ }
+
+
+
+
+void
+r_Complex_Type::set_re(char* cell, r_Double re) throw(r_Error)
+ {
+ r_Float ref=0.;
+ if( (typeId != r_Type::COMPLEXTYPE1) &&
+ (typeId != r_Type::COMPLEXTYPE2) )
+ {
+ RMInit::logOut << "r_Complex_Type::set_re(cell, re) type not a complex1 or complex2" << endl;
+ r_Error err( r_Error::r_Error_TypeInvalid );
+ throw( err );
+ }
+
+ switch (typeId)
+ {
+ case COMPLEXTYPE1:
+ ref=re;
+ memmove(cell, &ref, imOff);
+ break;
+ case COMPLEXTYPE2:
+ memmove(cell, &re, imOff);
+ break;
+ default:
+ RMDBGONCE(3, RMDebug::module_raslib, "r_Complex_Type", "set_re(...) bad typeId " << typeId);
+ break;
+ }
+ }
+
+void
+r_Complex_Type::set_im(char* cell, r_Double im) throw(r_Error)
+ {
+ r_Float imf= 0.;
+
+ if( (typeId != r_Type::COMPLEXTYPE1) &&
+ (typeId != r_Type::COMPLEXTYPE2) )
+ {
+ RMInit::logOut << "r_Complex_Type::set_im(cell, im) type not a complex1 or complex2" << endl;
+ r_Error err( r_Error::r_Error_TypeInvalid );
+ throw( err );
+ }
+
+ switch (typeId)
+ {
+ case COMPLEXTYPE1:
+ imf=im;
+ memmove((cell + imOff), &imf, imOff);
+ break;
+ case COMPLEXTYPE2:
+ memmove((cell + imOff), &im, imOff);
+ break;
+ default:
+ RMDBGONCE(3, RMDebug::module_raslib, "r_Complex_Type", "set_im(...) bad typeId " << typeId);
+ break;
+ }
+ }
+
+
+void
+r_Complex_Type::print_status(std::ostream& s) const
+ {
+ switch (typeId)
+ {
+ case COMPLEXTYPE1:
+ s << "complex(float, float)";
+ break;
+ case COMPLEXTYPE2:
+ s << "complex(double, double)";
+ break;
+ default:
+ RMDBGONCE(3, RMDebug::module_raslib, "r_Complex_Type", "print_status(...) bad typeId " << typeId);
+ break;
+ }
+ }
+
+void
+r_Complex_Type::print_value(const char* storage, std::ostream& s) const
+ {
+ s << "(" << get_re(storage) << ", " << get_im(storage) << ")";
+ }
+
+void
+r_Complex_Type::convertToLittleEndian(char* cells, r_Area noCells) const
+ {
+ switch (typeId)
+ {
+ case COMPLEXTYPE1:
+ for (r_Area i = 0; i < noCells; ++i)
+ {
+ *(r_Float*)(cells + i * typeSize) = r_Endian::swap((r_Float)get_re(cells + i * typeSize));
+ *(r_Float*)(cells + i * typeSize + imOff) = r_Endian::swap((r_Float)get_im(cells + i * typeSize));
+ }
+ break;
+
+ case COMPLEXTYPE2:
+ for (r_Area i = 0; i < noCells; ++i)
+ {
+ *(r_Double*)(cells + i * typeSize) = r_Endian::swap(get_re(cells + i * typeSize));
+ *(r_Double*)(cells + i * typeSize + imOff) = r_Endian::swap(get_im(cells + i * typeSize));
+ }
+ break;
+ default:
+ RMDBGONCE(3, RMDebug::module_raslib, "r_Complex_Type", "convertToLittleEndian(...) bad typeId " << typeId);
+ break;
+ }
+ }
+
+void
+r_Complex_Type::convertToBigEndian(char* cells, r_Area noCells) const
+ {
+ switch (typeId)
+ {
+ case COMPLEXTYPE1:
+ for (r_Area i = 0; i < noCells; ++i)
+ {
+ *(r_Float*)(cells + i * typeSize) = r_Endian::swap((r_Float)get_re(cells + i * typeSize));
+ *(r_Float*)(cells + i * typeSize + imOff) = r_Endian::swap((r_Float)get_im(cells + i * typeSize));
+ }
+ break;
+ case COMPLEXTYPE2:
+ for (r_Area i = 0; i < noCells; ++i)
+ {
+ *(r_Double*)(cells + i * typeSize) = r_Endian::swap(get_re(cells + i * typeSize));
+ *(r_Double*)(cells + i * typeSize + imOff) = r_Endian::swap(get_im(cells + i * typeSize));
+ }
+ break;
+ default:
+ RMDBGONCE(3, RMDebug::module_raslib, "r_Complex_Type", "convertToBigEndian(...) bad typeId " << typeId);
+ break;
+ }
+ }
+
+bool
+r_Complex_Type::isComplexType() const
+ {
+ return true;
+ }
+
+std::ostream &operator<<( std::ostream &str, const r_Complex_Type &type )
+{
+ type.print_status(str);
+ return str;
+}