lean cpp library
A lean C++ library providing efficient utility classes for high-performance C++ applications.
strings/types.h
00001 /*****************************************************/
00002 /* lean Strings                 (c) Tobias Zirr 2011 */
00003 /*****************************************************/
00004 
00005 #ifndef LEAN_STRINGS_TYPES
00006 #define LEAN_STRINGS_TYPES
00007 
00008 #include "../lean.h"
00009 #include "char_traits.h"
00010 #include "nullterminated.h"
00011 #include "nullterminated_range.h"
00012 #include "range.h"
00013 #include <string>
00014 
00015 namespace lean
00016 {
00017 namespace strings
00018 {
00019 namespace types
00020 {
00021 
00023 typedef nullterminated_implicit<char> char_nti;
00025 typedef nullterminated<char> char_nt;
00027 typedef nullterminated_range_implicit<char> char_ntri;
00029 typedef nullterminated_range<char> char_ntr;
00030 
00032 typedef nullterminated_implicit<wchar_t> wchar_nti;
00034 typedef nullterminated<wchar_t> wchar_nt;
00036 typedef nullterminated_range_implicit<wchar_t> wchar_ntri;
00038 typedef nullterminated_range<wchar_t> wchar_ntr;
00039 
00040 
00042 typedef nullterminated_implicit<char1> char1_nti;
00044 typedef nullterminated<char1> char1_nt;
00046 typedef nullterminated_range_implicit<char1> char1_ntri;
00048 typedef nullterminated_range<char1> char1_ntr;
00049 
00051 typedef nullterminated_implicit<char2> char2_nti;
00053 typedef nullterminated<char2> char2_nt;
00055 typedef nullterminated_range_implicit<char2> char2_ntri;
00057 typedef nullterminated_range<char2> char2_ntr;
00058 
00060 typedef nullterminated_implicit<char4> char4_nti;
00062 typedef nullterminated<char4> char4_nt;
00064 typedef nullterminated_range_implicit<char4> char4_ntri;
00066 typedef nullterminated_range<char4> char4_ntr;
00067 
00069 typedef std::basic_string<char1> char1_string;
00071 typedef std::basic_string<char2> char2_string;
00073 typedef std::basic_string<char4> char4_string;
00074 
00076 typedef nullterminated_implicit<utf8_t> utf8_nti;
00078 typedef nullterminated<utf8_t> utf8_nt;
00080 typedef nullterminated_range_implicit<utf8_t> utf8_ntri;
00082 typedef nullterminated_range<utf8_t> utf8_ntr;
00083 
00085 typedef nullterminated_implicit<utf16_t> utf16_nti;
00087 typedef nullterminated<utf16_t> utf16_nt;
00089 typedef nullterminated_range_implicit<utf16_t> utf16_ntri;
00091 typedef nullterminated_range<utf16_t> utf16_ntr;
00092 
00094 typedef nullterminated_implicit<utf32_t> utf32_nti;
00096 typedef nullterminated<utf32_t> utf32_nt;
00098 typedef nullterminated_range_implicit<utf32_t> utf32_ntri;
00100 typedef nullterminated_range<utf32_t> utf32_ntr;
00101 
00103 typedef std::basic_string<utf8_t> utf8_string;
00105 typedef std::basic_string<utf16_t> utf16_string;
00107 typedef std::basic_string<utf32_t> utf32_string;
00108 
00109 } // namespace
00110 
00111 using namespace types;
00112 
00113 // STL compatibility
00114 template <class Char, class StringTraits, class StringAllocator, class NullterminatedTraits>
00115 struct nullterminated_compatible< std::basic_string<Char, StringTraits, StringAllocator>, Char, NullterminatedTraits >
00116 {
00117     typedef std::basic_string<Char, StringTraits, StringAllocator> compatible_type;
00118 
00119     static LEAN_INLINE const Char* from(const compatible_type &from) { return from.c_str(); }
00120     static LEAN_INLINE const Char* from(const compatible_type &from, const Char *begin) { return begin + from.size(); }
00121     static compatible_type to(const Char *begin) { return compatible_type(begin); }
00122     static compatible_type to(const Char *begin, const Char *end) { return compatible_type(begin, end); }
00123 };
00124 
00126 template <class Type, size_t Size>
00127 LEAN_INLINE size_t ntarraylen(Type (&)[Size])
00128 {
00129     return (Size > 0)
00130         ? static_cast<size_t>(Size - 1)
00131         : 0;
00132 }
00133 
00134 } // namespace
00135 
00136 using strings::char_nti;
00137 using strings::char_nt;
00138 using strings::char_ntri;
00139 using strings::char_ntr;
00140 using strings::wchar_nti;
00141 using strings::wchar_nt;
00142 using strings::wchar_ntri;
00143 using strings::wchar_ntr;
00144 
00145 using strings::char1_nti;
00146 using strings::char1_nt;
00147 using strings::char1_ntri;
00148 using strings::char1_ntr;
00149 using strings::char2_nti;
00150 using strings::char2_nt;
00151 using strings::char2_ntri;
00152 using strings::char2_ntr;
00153 using strings::char4_nti;
00154 using strings::char4_nt;
00155 using strings::char4_ntri;
00156 using strings::char4_ntr;
00157 
00158 using strings::char1_string;
00159 using strings::char2_string;
00160 using strings::char4_string;
00161 
00162 using strings::utf8_nti;
00163 using strings::utf8_nt;
00164 using strings::utf8_ntri;
00165 using strings::utf8_ntr;
00166 
00167 using strings::utf16_nti;
00168 using strings::utf16_nt;
00169 using strings::utf16_ntri;
00170 using strings::utf16_ntr;
00171 
00172 using strings::utf32_nti;
00173 using strings::utf32_nt;
00174 using strings::utf32_ntri;
00175 using strings::utf32_ntr;
00176 
00177 using strings::utf8_string;
00178 using strings::utf16_string;
00179 using strings::utf32_string;
00180 
00181 using strings::ntarraylen;
00182 
00183 } // namespace
00184 
00185 #endif