straits.h
上传用户:sichengcw
上传日期:2009-02-17
资源大小:202k
文件大小:5k
源码类别:

STL

开发平台:

Visual C++

  1. // Character traits template for the -*- C++ -*- string classes.
  2. // Copyright (C) 1994 Free Software Foundation
  3. // This file is part of the GNU ANSI C++ Library.  This library is free
  4. // software; you can redistribute it and/or modify it under the
  5. // terms of the GNU General Public License as published by the
  6. // Free Software Foundation; either version 2, or (at your option)
  7. // any later version.
  8. // This library is distributed in the hope that it will be useful,
  9. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11. // GNU General Public License for more details.
  12. // You should have received a copy of the GNU General Public License
  13. // along with this library; see the file COPYING.  If not, write to the Free
  14. // Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  15. // As a special exception, if you link this library with files
  16. // compiled with a GNU compiler to produce an executable, this does not cause
  17. // the resulting executable to be covered by the GNU General Public License.
  18. // This exception does not however invalidate any other reasons why
  19. // the executable file might be covered by the GNU General Public License.
  20. // Written by Jason Merrill based upon the specification by Takanori Adachi
  21. // in ANSI X3J16/94-0013R2.
  22. #ifndef __STRING_CHAR_TRAITS__
  23. #define __STRING_CHAR_TRAITS__
  24. #ifdef __GNUG__
  25. // For string_char_traits <char>
  26. #pragma interface "std/straits.h"
  27. #endif
  28. #include <cstddef>
  29. extern "C++" {
  30. template <class charT>
  31. struct string_char_traits {
  32.   typedef charT char_type; // for users to acquire the basic character type
  33.   // constraints
  34.   static void assign (char_type& c1, const char_type& c2)
  35.     { c1 = c2; }
  36.   static bool eq (const char_type& c1, const char_type& c2)
  37.     { return (c1 == c2); }
  38.   static bool ne (const char_type& c1, const char_type& c2)
  39.     { return !(c1 == c2); }
  40.   static bool lt (const char_type& c1, const char_type& c2)
  41.     { return (c1 < c2); }
  42.   static char_type eos () { return char_type(); } // the null character
  43.   static bool is_del(char_type a) { return 0; }
  44.   // characteristic function for delimiters of charT
  45.   
  46.   // speed-up functions
  47.   static int compare (const char_type* s1, const char_type* s2, size_t n)
  48.     {
  49.       size_t i;
  50.       for (i = 0; i < n; ++i)
  51. if (ne (s1[i], s2[i]))
  52.   return lt (s1[i], s2[i]) ? -1 : 1;
  53.       return 0;
  54.     }
  55.     
  56.   static size_t length (const char_type* s)
  57.     {
  58.       size_t l = 0;
  59.       while (ne (*s++, eos ()))
  60. ++l;
  61.       return l;
  62.     }
  63.   static char_type* copy (char_type* s1, const char_type* s2, size_t n)
  64.     {
  65.       for (; n--; )
  66. assign (s1[n], s2[n]);
  67.       return s1;
  68.     }
  69.   static char_type* move (char_type* s1, const char_type* s2, size_t n)
  70.     {
  71.       char_type a[n];
  72.       size_t i;
  73.       for (i = 0; i < n; ++i)
  74. assign (a[i], s2[i]);
  75.       for (i = 0; i < n; ++i)
  76. assign (s1[i], a[i]);
  77.       return s1;
  78.     }
  79.   static char_type* set (char_type* s1, const char_type& c, size_t n)
  80.     {
  81.       for (; n--; )
  82. assign (s1[n], c);
  83.       return s1;
  84.     }
  85. };
  86. class istream;
  87. class ostream;
  88. #include <cctype>
  89. #include <cstring>
  90. struct string_char_traits <char> {
  91.   typedef char char_type;
  92.   static void assign (char_type& c1, const char_type& c2)
  93.     { c1 = c2; }
  94.   static bool eq (const char_type & c1, const char_type& c2)
  95.     { return (c1 == c2); }
  96.   static bool ne (const char_type& c1, const char_type& c2)
  97.     { return (c1 != c2); }
  98.   static bool lt (const char_type& c1, const char_type& c2)
  99.     { return (c1 < c2); }
  100.   static char_type eos () { return 0; }
  101.   static bool is_del(char_type a) { return isspace(a); }
  102.   static int compare (const char_type* s1, const char_type* s2, size_t n)
  103.     { return memcmp (s1, s2, n); }
  104.   static size_t length (const char_type* s)
  105.     { return strlen (s); }
  106.   static char_type* copy (char_type* s1, const char_type* s2, size_t n)
  107.     { return (char_type*) memcpy (s1, s2, n); }
  108.   static char_type* move (char_type* s1, const char_type* s2, size_t n)
  109.     { return (char_type*) memmove (s1, s2, n); }
  110.   static char_type* set (char_type* s1, const char_type& c, size_t n)
  111.     { return (char_type*) memset (s1, c, n); }
  112. };
  113. #if 0
  114. #include <cwctype>
  115. struct string_char_traits <wchar_t> {
  116.   typedef wchar_t char_type;
  117.   static void assign (char_type& c1, const char_type& c2)
  118.     { c1 = c2; }
  119.   static bool eq (const char_type & c1, const char_type& c2)
  120.     { return (c1 == c2); }
  121.   static bool ne (const char_type& c1, const char_type& c2)
  122.     { return (c1 != c2); }
  123.   static bool lt (const char_type& c1, const char_type& c2)
  124.     { return (c1 < c2); }
  125.   static char_type eos () { return 0; }
  126.   static bool is_del(char_type a) { return iswspace(a); }
  127.   static int compare (const char_type* s1, const char_type* s2, size_t n)
  128.     { return wmemcmp (s1, s2, n); }
  129.   static size_t length (const char_type* s)
  130.     { return wcslen (s); }
  131.   static char_type* copy (char_type* s1, const char_type* s2, size_t n)
  132.     { return wmemcpy (s1, s2, n); }
  133.   static char_type* set (char_type* s1, const char_type& c, size_t n)
  134.     { return wmemset (s1, c, n); }
  135. };
  136. #endif
  137. } // extern "C++"
  138. #endif