X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2FgdcmUtil.cxx;h=05c33b49f23f319226ead6b018e18cef60ca503c;hb=e51a044cdd1df9c7313926d66e2b999e5d98388b;hp=d1b23d8e28817daaeb9896b47526cf3af7fac537;hpb=0068e5861800986e33ee5eeac99863c4e01e3512;p=gdcm.git diff --git a/src/gdcmUtil.cxx b/src/gdcmUtil.cxx index d1b23d8e..05c33b49 100644 --- a/src/gdcmUtil.cxx +++ b/src/gdcmUtil.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmUtil.cxx,v $ Language: C++ - Date: $Date: 2005/02/11 19:06:55 $ - Version: $Revision: 1.135 $ + Date: $Date: 2005/02/14 15:52:39 $ + Version: $Revision: 1.143 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -98,7 +98,8 @@ std::string Util::RootUID = GDCM_UID; /** * \brief Provide a better 'c++' approach for sprintf * For example c code is: - * sprintf(trash, "%04x|%04x", group , elem); + * char result[200]; // hope 200 is enough + * sprintf(result, "%04x|%04x", group , elem); * * c++ code is * std::ostringstream buf; @@ -108,7 +109,8 @@ std::string Util::RootUID = GDCM_UID; * buf.str(); * * gdcm style code is - * Format("%04x|%04x", group , elem); + * string result; + * result = gdcm::Util::Format("%04x|%04x", group , elem); */ std::string Util::Format(const char *format, ...) { @@ -125,6 +127,10 @@ std::string Util::Format(const char *format, ...) /** * \brief Because not available in C++ (?) + * @param str string to check + * @param tokens std::vector to receive the tokenized substrings + * @param delimiters string containing the character delimitors + */ void Util::Tokenize (const std::string &str, std::vector &tokens, @@ -143,24 +149,26 @@ void Util::Tokenize (const std::string &str, /** * \brief Because not available in C++ (?) * Counts the number of occurences of a substring within a string + * @param str string to check + * @param subStr substring to count */ int Util::CountSubstring (const std::string &str, const std::string &subStr) { - int count = 0; // counts how many times it appears - std::string::size_type x = 0; // The index position in the string + int count = 0; // counts how many times it appears + std::string::size_type x = 0; // The index position in the string do { - x = str.find(subStr,x); // Find the substring - if (x != std::string::npos) // If present + x = str.find(subStr,x); // Find the substring + if (x != std::string::npos) // If present { - count++; // increase the count - x += subStr.length(); // Skip this word + count++; // increase the count + x += subStr.length(); // Skip this word } } - while (x != std::string::npos); // Carry on until not present + while (x != std::string::npos);// Carry on until not present return count; } @@ -351,7 +359,7 @@ unsigned int Util::GetCurrentProcessID() */ bool Util::IsCurrentProcessorBigEndian() { -#ifdef GDCM_WORDS_BIGENDIAN +#if defined(GDCM_WORDS_BIGENDIAN) return true; #else return false; @@ -741,7 +749,8 @@ std::string Util::GetMACAddress() { res = getlastdigit(addr); sres.insert(sres.begin(), '0' + res); - zero = (addr[0] == 0) && (addr[1] == 0) && (addr[2] == 0) && (addr[3] == 0) && (addr[4] == 0) && (addr[5] == 0); + zero = (addr[0] == 0) && (addr[1] == 0) && (addr[2] == 0) + && (addr[3] == 0) && (addr[4] == 0) && (addr[5] == 0); } return sres; @@ -809,17 +818,6 @@ const std::string &Util::GetRootUID() } //------------------------------------------------------------------------- -/** - * \brief class for binary write - * @param os ostream to write to - * @param val val - */ -template -std::ostream &binary_write(std::ostream &os, const T &val) -{ - return os.write(reinterpret_cast(&val), sizeof val); -} - /** * \brief binary_write binary_write * @param os ostream to write to @@ -827,9 +825,12 @@ std::ostream &binary_write(std::ostream &os, const T &val) */ std::ostream &binary_write(std::ostream &os, const uint16_t &val) { -#ifdef GDCM_WORDS_BIGENDIAN +#if defined(GDCM_WORDS_BIGENDIAN) || defined(GDCM_FORCE_BIGENDIAN_EMULATION) uint16_t swap; - swap = ((( val << 8 ) & 0xff00 ) | (( val >> 8 ) & 0x00ff ) ); + //swap = ((( val << 8 ) & 0xff00 ) | (( val >> 8 ) & 0x00ff ) ); + //save CPU time + swap = ( val << 8 | val >> 8 ); + return os.write(reinterpret_cast(&swap), 2); #else return os.write(reinterpret_cast(&val), 2); @@ -843,10 +844,13 @@ std::ostream &binary_write(std::ostream &os, const uint16_t &val) */ std::ostream &binary_write(std::ostream &os, const uint32_t &val) { -#ifdef GDCM_WORDS_BIGENDIAN +#if defined(GDCM_WORDS_BIGENDIAN) || defined(GDCM_FORCE_BIGENDIAN_EMULATION) uint32_t swap; - swap = ( ((val<<24) & 0xff000000) | ((val<<8) & 0x00ff0000) | - ((val>>8) & 0x0000ff00) | ((val>>24) & 0x000000ff) ); +// swap = ( ((val<<24) & 0xff000000) | ((val<<8) & 0x00ff0000) | +// ((val>>8) & 0x0000ff00) | ((val>>24) & 0x000000ff) ); +// save CPU time + swap = ( (val<<24) | ((val<<8) & 0x00ff0000) | + ((val>>8) & 0x0000ff00) | (val>>24) ); return os.write(reinterpret_cast(&swap), 4); #else return os.write(reinterpret_cast(&val), 4); @@ -876,7 +880,8 @@ std::ostream &binary_write(std::ostream &os, std::string const &val) /** * \brief binary_write binary_write * @param os ostream to write to - * @param val val + * @param val value + * @param len length of the 'value' to be written */ std::ostream &binary_write(std::ostream &os, const uint8_t *val, size_t len) { @@ -888,15 +893,19 @@ std::ostream &binary_write(std::ostream &os, const uint8_t *val, size_t len) * \brief binary_write binary_write * @param os ostream to write to * @param val val + * @param len length of the 'value' to be written */ std::ostream &binary_write(std::ostream &os, const uint16_t *val, size_t len) { -// This is tricky since we are writting two bytes buffer. Be carefull with little endian -// vs big endian. Also this other trick is to allocate a small (efficient) buffer that store -// intermidiate result before writting it. -#ifdef GDCM_WORDS_BIGENDIAN +// This is tricky since we are writting two bytes buffer. +// Be carefull with little endian vs big endian. +// Also this other trick is to allocate a small (efficient) buffer that store +// intermediate result before writting it. +#if defined(GDCM_WORDS_BIGENDIAN) || defined(GDCM_FORCE_BIGENDIAN_EMULATION) const int BUFFER_SIZE = 4096; - uint16_t *buffer = new uint16_t[BUFFER_SIZE/2]; + uint16_t *binArea16 = (uint16_t*)val; + static uint16_t buffer[BUFFER_SIZE/2]; + uint16_t *pbuffer = buffer; // how many BUFFER_SIZE long pieces in binArea ? int nbPieces = len/BUFFER_SIZE; //(16 bits = 2 Bytes) @@ -904,26 +913,35 @@ std::ostream &binary_write(std::ostream &os, const uint16_t *val, size_t len) for (int j=0;j> 8) | (binArea16[i] << 8); - uint16_t val = binArea16[i]; - buffer[i] = ((( val << 8 ) & 0xff00 ) | (( val >> 8 ) & 0x00ff ) ); + //uint16_t val16 = binArea16[i]; + //buffer[i] = ((( val16 << 8 ) & 0xff00 ) | (( val16 >> 8 ) & 0x00ff ) ); + // save CPU time : + // 1) Save 1 affectation and 2 AND operations + // buffer[i] = (binArea16[i] >> 8) | (binArea16[i] << 8); + // 2) Replace * operations by + operations using pointers + *pbuffer = *binArea16 >> 8 | *binArea16 << 8; + pbuffer++; + binArea16++; } - fp->write ( (char*)buffer, BUFFER_SIZE ); + os.write ( (char*)buffer, BUFFER_SIZE ); binArea16 += BUFFER_SIZE/2; } if ( remainingSize > 0) { for (int i = 0; i < remainingSize/2; i++) { - //buffer[i] = (binArea16[i] >> 8) | (binArea16[i] << 8); - uint16_t val = binArea16[i]; - buffer[i] = ((( val << 8 ) & 0xff00 ) | (( val >> 8 ) & 0x00ff ) ); + //uint16_t val16 = binArea16[i]; + //buffer[i] = ((( val16 << 8 ) & 0xff00 ) | (( val16 >> 8 ) & 0x00ff) ); + *pbuffer = *binArea16 >> 8 | *binArea16 >> 8; + pbuffer++; + binArea16++; } - fp->write ( (char*)buffer, remainingSize ); + os.write ( (char*)buffer, remainingSize ); } - delete[] buffer; + return os; #else return os.write(reinterpret_cast(val), len); #endif