1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
   |  
template <class T>
   class xstring_traits
      : public std::char_traits<T>
   {
   public:
 
   typedef T char_type;
 
      static int compare (const char_type *Str1, const char_type *Str2, 
                          size_t Num)
      {
         for (size_t i = 0; i < Num; ++i)
            if (!eq (*(Str1 + i), *(Str2 + i)))
               return lt (*(Str1 + i), *(Str2 + i))? -1 : 1;
         return 0;
      }
      static bool eq(const char_type &Ch1, const char_type &Ch2)
      {
         const std::locale & loc = std::locale ("");
         return std::toupper (Ch1, loc) == std::toupper (Ch2, loc);
      }
 
      static bool ne(const char_type &Ch1, const char_type &Ch2)
      {
         const std::locale & loc = std::locale ("");
         return std::toupper (Ch1, loc) != std::toupper (Ch2, loc);
      }
 
      static bool lt(const char_type &Ch1, const char_type &Ch2)
      {
         const std::locale & loc = std::locale ("");
         return std::toupper (Ch1, loc) < std::toupper (Ch2, loc);
      }
   };
 
 
template <class T>
   std::basic_ostream<T> & operator << (std::basic_ostream<T> &os, const std::basic_string <T, xstring_traits<T> > &s)
   {
      return os << std::basic_string<T> (s.begin (), s.end ());
   }
 
template <class T>
   std::basic_istream<T> & operator >> (std::basic_istream<T> &is, std::basic_string <T, xstring_traits<T> > &s)
   {
      std::basic_string<T> _s;
      is >> _s;
      s = std::basic_string <T, xstring_traits<T> > (_s.begin (), _s.end ());
      return is;
   }
 
template <class T>
std::basic_istream<T> & getline (std::basic_istream<T> &is, std::basic_string <T, xstring_traits<T> > &s)
   {
      std::basic_string<T> _s;
      std::getline (is, _s);
      s = std::basic_string <T, xstring_traits<T> > (_s.begin (), _s.end ());
      return is;
   }
 
template <class T>
std::basic_istream<T> & getline (std::basic_istream<T> &is, std::basic_string <T, xstring_traits<T> > &s, char delim)
   {
      std::basic_string<T> _s;
      std::getline (is, _s, delim);
      s = std::basic_string <T, xstring_traits<T> > (_s.begin (), _s.end ());
      return is;
   }
 
 
typedef std::basic_string        <char, xstring_traits<char> > xstring;
typedef std::basic_stringstream  <char, xstring_traits<char> > xstringstream;
typedef std::basic_istringstream <char, xstring_traits<char> > xistringstream;
typedef std::basic_ostringstream <char, xstring_traits<char> > xostringstream; | 
Partager