gdcmString.h

Go to the documentation of this file.
00001 /*=========================================================================
00002 
00003   Program: GDCM (Grassroots DICOM). A DICOM library
00004   Module:  $URL$
00005 
00006   Copyright (c) 2006-2010 Mathieu Malaterre
00007   All rights reserved.
00008   See Copyright.txt or http://gdcm.sourceforge.net/Copyright.html for details.
00009 
00010      This software is distributed WITHOUT ANY WARRANTY; without even
00011      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
00012      PURPOSE.  See the above copyright notice for more information.
00013 
00014 =========================================================================*/
00015 #ifndef GDCMSTRING_H
00016 #define GDCMSTRING_H
00017 
00018 #include "gdcmTypes.h"
00019 #include "gdcmStaticAssert.h"
00020 
00021 namespace gdcm
00022 {
00023 
00031 template <char TDelimiter = '\\', unsigned int TMaxLength = 64, char TPadChar = ' '>
00032 class /*GDCM_EXPORT*/ String : public std::string /* PLEASE do not export me */
00033 {
00034   // UI wants \0 for pad character, while ASCII ones wants space char... do not allow anything else
00035   GDCM_STATIC_ASSERT( TPadChar == ' ' || TPadChar == 0 );
00036 
00037 public:
00038   // typedef are not inherited:
00039   typedef std::string::value_type             value_type;
00040   typedef std::string::pointer                pointer;
00041   typedef std::string::reference              reference;
00042   typedef std::string::const_reference        const_reference;
00043   typedef std::string::size_type              size_type;
00044   typedef std::string::difference_type        difference_type;
00045   typedef std::string::iterator               iterator;
00046   typedef std::string::const_iterator         const_iterator;
00047   typedef std::string::reverse_iterator       reverse_iterator;
00048   typedef std::string::const_reverse_iterator const_reverse_iterator;
00049 
00051   String(): std::string() {}
00052   String(const value_type* s): std::string(s)
00053   {
00054   if( size() % 2 )
00055     {
00056     push_back( TPadChar );
00057     }
00058   }
00059   String(const value_type* s, size_type n): std::string(s, n) 
00060   {
00061   // We are being passed a const char* pointer, so s[n] == 0 (garanteed!)
00062   if( n % 2 )
00063     {
00064     push_back( TPadChar );
00065     }
00066   }
00067   String(const std::string& s, size_type pos=0, size_type n=npos):
00068     std::string(s, pos, n) 
00069   {
00070   // FIXME: some users might already have padded the string 's' with a trailing \0...
00071   if( size() % 2 )
00072     {
00073     push_back( TPadChar );
00074     }
00075   }
00076 
00078   operator const char *() { return this->c_str(); }
00079 
00081   bool IsValid() const {
00082     // Check Length:
00083     size_type l = size();
00084     if( l > TMaxLength ) return false;
00085     return true;
00086   }
00087 
00088   gdcm::String<TDelimiter, TMaxLength, TPadChar> Truncate() const {
00089     if( IsValid() ) return *this;
00090     std::string str = *this; // copy
00091     str.resize( TMaxLength );
00092     return str;
00093   }
00094 
00097   std::string Trim() const {
00098     std::string str = *this; // copy
00099     std::string::size_type pos1 = str.find_first_not_of(' ');
00100     std::string::size_type pos2 = str.find_last_not_of(' ');
00101     str = str.substr( (pos1 == std::string::npos) ? 0 : pos1, 
00102       (pos2 == std::string::npos) ? (str.size() - 1) : (pos2 - pos1 + 1));
00103     return str;
00104   }
00105 
00106 };
00107 template <char TDelimiter, unsigned int TMaxLength, char TPadChar>
00108 inline std::istream& operator>>(std::istream &is, String<TDelimiter,TMaxLength,TPadChar> &ms)
00109 {
00110   if(is)
00111     {
00112     std::getline(is, ms, TDelimiter);
00113     // no such thing as std::get where the delim char would be left, so I need to manually add it back...
00114     // hopefully this is the right thing to do (no overhead)
00115     is.putback( TDelimiter );
00116     }
00117   return is;
00118 }
00119 //template <char TDelimiter = EOF, unsigned int TMaxLength = 64, char TPadChar = ' '>
00120 //String String::Trim() const
00121 //{
00122 //  String s;
00123 //  return s;
00124 //}
00125 
00126 } // end namespace gdcm
00127 
00128 #endif //GDCMSTRING_H
00129 

Generated on Sat Dec 4 2010 08:58:47 for GDCM by doxygen 1.7.2
SourceForge.net Logo