From 8f27e65bddd7d4b8515ce620fb485fdd78fcdf89 Mon Sep 17 00:00:00 2001 From: Constantin Jucovschi Date: Fri, 24 Apr 2009 07:20:22 -0400 Subject: Initial commit --- raslib/endian.hh | 118 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100644 raslib/endian.hh (limited to 'raslib/endian.hh') diff --git a/raslib/endian.hh b/raslib/endian.hh new file mode 100644 index 0000000..fb8e0ff --- /dev/null +++ b/raslib/endian.hh @@ -0,0 +1,118 @@ +/* +* 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 . +/ +/** + * INCLUDE: endian.hh + * + * MODULE: raslib + * CLASS: r_Endian + * + * COMMENTS: + * None +*/ + +#ifndef _R_ENDIANTOOLS_HH_ +#define _R_ENDIANTOOLS_HH_ + +#include + +class r_Minterval; +class r_Base_Type; +class r_Primitive_Type; +#include "raslib/odmgtypes.hh" +#include "raslib/mddtypes.hh" + +//@ManMemo: Module {\bf raslib} + +/*@Doc: + Class to check the endianness of the host machine and to + swap the endianness of types and arrays. Don't instantiate, + static members only. +*/ + +class r_Endian +{ + public: + /// endianness identifiers + enum r_Endianness { + r_Endian_Big, + r_Endian_Little + }; + + /// swap endianness of atomic types + static r_Short swap( r_Short val ); + static r_UShort swap( r_UShort val ); + static r_Long swap( r_Long val ); + static r_ULong swap( r_ULong val ); + static r_Float swap( r_Float val ); + static r_Double swap( r_Double val ); + + /// query host machine's endianness + static r_Endianness get_endianness( void ); + + /// change the endianness of a linear array of size and type + static void swap_array( const r_Primitive_Type *type, r_Bytes size, const void *src, void *dest ); + + /// change the endianness of a linear array of size , type implicit + static void swap_array( r_Bytes size, const r_Octet *src, r_Octet *dest ); // dummy + static void swap_array( r_Bytes size, const r_Char *src, r_Char *dest ); // dummy + static void swap_array( r_Bytes size, const r_Short *src, r_Short *dest ); + static void swap_array( r_Bytes size, const r_UShort *src, r_UShort *dest ); + static void swap_array( r_Bytes size, const r_Long *src, r_Long *dest ); + static void swap_array( r_Bytes size, const r_ULong *src, r_ULong *dest ); + static void swap_array( r_Bytes size, const r_Float *src, r_Float *dest ); + static void swap_array( r_Bytes size, const r_Double *src, r_Double *dest ); + + /// change the endianness of a linear array of size with type size + static void swap_array( r_Bytes size, r_Bytes tsize, const void *src, void *dest); + + /// change the endianness of one type member of an array for identical domains + /// for src and dest; step is the increment between cells + static void swap_array( const r_Primitive_Type *type, const r_Minterval &srcDom, + const r_Minterval &srcIterDom, const void *src, void *dest, + r_ULong step ); + + /// change the endianness of the entire tile for identical domains for src and dest + static void swap_array( const r_Base_Type *type, const r_Minterval &srcDom, + const r_Minterval &srcIterDom, const void *src, void *dest ); + + /// change the endianness of one type member of an array for the generic case; + /// step is the increment between cells. + static void swap_array( const r_Primitive_Type *type, const r_Minterval &srcDom, + const r_Minterval &srcIterDom, const r_Minterval &destDom, + const r_Minterval &destIterDom, const void *src, void *dest, + r_ULong step ); + + /// change the endianness of the entire tile for the generic case + static void swap_array( const r_Base_Type *type, const r_Minterval &srcDom, + const r_Minterval &srcIterDom, const r_Minterval &destDom, + const r_Minterval &destIterDom, const void *src, void *dest ); +}; + +//@ManMemo: Module: {\bf raslib} +/** + Output stream operator for enum of type {\tt const} \Ref{r_Minterval}. + */ + extern std::ostream& operator<<( std::ostream& s, r_Endian::r_Endianness& e ); + + +#endif -- cgit