blocxx
|
00001 /******************************************************************************* 00002 * Copyright (C) 2005, Vintela, Inc. All rights reserved. 00003 * Copyright (C) 2006, Novell, Inc. All rights reserved. 00004 * 00005 * Redistribution and use in source and binary forms, with or without 00006 * modification, are permitted provided that the following conditions are met: 00007 * 00008 * * Redistributions of source code must retain the above copyright notice, 00009 * this list of conditions and the following disclaimer. 00010 * * Redistributions in binary form must reproduce the above copyright 00011 * notice, this list of conditions and the following disclaimer in the 00012 * documentation and/or other materials provided with the distribution. 00013 * * Neither the name of 00014 * Vintela, Inc., 00015 * nor Novell, Inc., 00016 * nor the names of its contributors or employees may be used to 00017 * endorse or promote products derived from this software without 00018 * specific prior written permission. 00019 * 00020 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 00021 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 00022 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 00023 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 00024 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 00025 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 00026 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 00027 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 00028 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 00029 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 00030 * POSSIBILITY OF SUCH DAMAGE. 00031 *******************************************************************************/ 00032 00033 00038 #ifndef BLOCXX_BYTE_SWAP_HPP_ 00039 #define BLOCXX_BYTE_SWAP_HPP_ 00040 #include "blocxx/BLOCXX_config.h" 00041 #include "blocxx/Types.hpp" 00042 00043 #if !defined(BLOCXX_WORDS_BIGENDIAN) && defined(BLOCXX_HAVE_BYTESWAP_H) && !defined(BLOCXX_DEBUG_MEMORY) 00044 #include <byteswap.h> 00045 #endif 00046 00047 namespace BLOCXX_NAMESPACE 00048 { 00049 00050 // this will be defined by the configure script. 00051 #ifndef BLOCXX_WORDS_BIGENDIAN 00052 #if defined(BLOCXX_HAVE_BYTESWAP_H) && !defined(BLOCXX_DEBUG_MEMORY) 00053 00059 inline UInt16 hton16(UInt16 v) { return __bswap_16(v); } 00065 inline UInt32 hton32(UInt32 v) { return __bswap_32(v); } 00071 inline UInt64 hton64(UInt64 v) { return __bswap_64(v); } 00077 inline UInt16 ntoh16(UInt16 v) { return __bswap_16(v); } 00083 inline UInt32 ntoh32(UInt32 v) { return __bswap_32(v); } 00089 inline UInt64 ntoh64(UInt64 v) { return __bswap_64(v); } 00090 #else 00091 inline UInt16 hton16(UInt16 v) 00092 { 00093 UInt16 rval; 00094 (reinterpret_cast<unsigned char*>(&rval))[1] = (reinterpret_cast<unsigned char*>(&v))[0]; 00095 (reinterpret_cast<unsigned char*>(&rval))[0] = (reinterpret_cast<unsigned char*>(&v))[1]; 00096 return rval; 00097 } 00098 inline UInt32 hton32(UInt32 v) 00099 { 00100 UInt32 rval; 00101 (reinterpret_cast<unsigned char*>(&rval))[3] = (reinterpret_cast<unsigned char*>(&v))[0]; 00102 (reinterpret_cast<unsigned char*>(&rval))[2] = (reinterpret_cast<unsigned char*>(&v))[1]; 00103 (reinterpret_cast<unsigned char*>(&rval))[1] = (reinterpret_cast<unsigned char*>(&v))[2]; 00104 (reinterpret_cast<unsigned char*>(&rval))[0] = (reinterpret_cast<unsigned char*>(&v))[3]; 00105 return rval; 00106 } 00107 inline UInt64 hton64(UInt64 v) 00108 { 00109 UInt64 rval; 00110 (reinterpret_cast<unsigned char*>(&rval))[7] = (reinterpret_cast<unsigned char*>(&v))[0]; 00111 (reinterpret_cast<unsigned char*>(&rval))[6] = (reinterpret_cast<unsigned char*>(&v))[1]; 00112 (reinterpret_cast<unsigned char*>(&rval))[5] = (reinterpret_cast<unsigned char*>(&v))[2]; 00113 (reinterpret_cast<unsigned char*>(&rval))[4] = (reinterpret_cast<unsigned char*>(&v))[3]; 00114 (reinterpret_cast<unsigned char*>(&rval))[3] = (reinterpret_cast<unsigned char*>(&v))[4]; 00115 (reinterpret_cast<unsigned char*>(&rval))[2] = (reinterpret_cast<unsigned char*>(&v))[5]; 00116 (reinterpret_cast<unsigned char*>(&rval))[1] = (reinterpret_cast<unsigned char*>(&v))[6]; 00117 (reinterpret_cast<unsigned char*>(&rval))[0] = (reinterpret_cast<unsigned char*>(&v))[7]; 00118 return rval; 00119 } 00120 inline UInt16 ntoh16(UInt16 v) 00121 { 00122 return hton16(v); 00123 } 00124 inline UInt32 ntoh32(UInt32 v) 00125 { 00126 return hton32(v); 00127 } 00128 inline UInt64 ntoh64(UInt64 v) 00129 { 00130 return hton64(v); 00131 } 00132 #endif 00133 #else // we're big-endian, just pass-thru 00134 inline UInt16 hton16(UInt16 v) { return v; } 00135 inline UInt32 hton32(UInt32 v) { return v; } 00136 inline UInt64 hton64(UInt64 v) { return v; } 00137 inline UInt16 ntoh16(UInt16 v) { return v; } 00138 inline UInt32 ntoh32(UInt32 v) { return v; } 00139 inline UInt64 ntoh64(UInt64 v) { return v; } 00140 #endif 00141 00142 } // end namespace BLOCXX_NAMESPACE 00143 00144 #endif