00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00051 #ifndef STLSOFT_INCL_STLSOFT_STRING_HPP_VIEW_SLICE_FUNCTIONS
00052 #define STLSOFT_INCL_STLSOFT_STRING_HPP_VIEW_SLICE_FUNCTIONS
00053
00054 #ifndef STLSOFT_DOCUMENTATION_SKIP_SECTION
00055 # define STLSOFT_VER_INCL_STLSOFT_STRING_HPP_VIEW_SLICE_FUNCTIONS_MAJOR 2
00056 # define STLSOFT_VER_INCL_STLSOFT_STRING_HPP_VIEW_SLICE_FUNCTIONS_MINOR 1
00057 # define STLSOFT_VER_INCL_STLSOFT_STRING_HPP_VIEW_SLICE_FUNCTIONS_REVISION 4
00058 # define STLSOFT_VER_INCL_STLSOFT_STRING_HPP_VIEW_SLICE_FUNCTIONS_EDIT 24
00059 #endif
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076 #ifndef STLSOFT_INCL_STLSOFT_H_STLSOFT
00077 # include <stlsoft/stlsoft.h>
00078 #endif
00079 #if defined(STLSOFT_COMPILER_IS_MWERKS) && \
00080 ((__MWERKS__ & 0xff00) < 0x3000)
00081 # error stlsoft/string/view_slice_functions.hpp not compatible with Metrowerks 7.x (v2.4)
00082 #endif
00083 #ifndef STLSOFT_INCL_STLSOFT_SHIMS_ACCESS_HPP_STRING
00084 # include <stlsoft/shims/access/string.hpp>
00085 #endif
00086 #ifndef STLSOFT_INCL_STLSOFT_STRING_HPP_STRING_VIEW
00087 # include <stlsoft/string/string_view.hpp>
00088 #endif
00089
00090 #ifdef STLSOFT_UNITTEST
00091 # include <string>
00092 # ifndef STLSOFT_INCL_STLSOFT_STRING_HPP_SIMPLE_STRING
00093 # include <stlsoft/string/simple_string.hpp>
00094 # endif
00095 #endif
00096
00097
00098
00099
00100
00101 #ifndef _STLSOFT_NO_NAMESPACE
00102 namespace stlsoft
00103 {
00104 #endif
00105
00106
00107
00108
00109
00110 #ifndef STLSOFT_DOCUMENTATION_SKIP_SECTION
00111
00112 template <ss_typename_param_k S>
00113 struct string_view_helper_traits
00114 {
00115 typedef S string_type;
00116 typedef ss_typename_type_k string_type::value_type char_type;
00117 typedef basic_string_view<char_type> view_type;
00118 };
00119
00120 #if 0
00121 STLSOFT_TEMPLATE_SPECIALISATION
00122 struct string_view_helper_traits<ss_char_a_t*>
00123 {
00124 typedef ss_char_a_t char_type;
00125 typedef basic_string_view<char_type> view_type;
00126 };
00127 #endif
00128
00129 STLSOFT_TEMPLATE_SPECIALISATION
00130 struct string_view_helper_traits<ss_char_a_t const*>
00131 {
00132 typedef ss_char_a_t char_type;
00133 typedef basic_string_view<char_type> view_type;
00134 };
00135
00136 #if 0
00137 STLSOFT_TEMPLATE_SPECIALISATION
00138 struct string_view_helper_traits<ss_char_w_t*>
00139 {
00140 typedef ss_char_w_t char_type;
00141 typedef basic_string_view<char_type> view_type;
00142 };
00143 #endif
00144
00145 STLSOFT_TEMPLATE_SPECIALISATION
00146 struct string_view_helper_traits<ss_char_w_t const*>
00147 {
00148 typedef ss_char_w_t char_type;
00149 typedef basic_string_view<char_type> view_type;
00150 };
00151
00152 #endif
00153
00154
00155
00156
00157
00158 #ifndef STLSOFT_DOCUMENTATION_SKIP_SECTION
00159 template <ss_typename_param_k C>
00160 inline basic_string_view<C> left_view_helper(C const* s, ss_size_t n)
00161 {
00162 const ss_size_t len = stlsoft_ns_qual(c_str_len)(s);
00163
00164 if(n > len)
00165 {
00166
00167 n = len;
00168 }
00169
00170 return basic_string_view<C>(s, n);
00171 }
00172 #endif
00173
00178 inline basic_string_view<ss_char_a_t> left_view(ss_char_a_t const* s, ss_size_t n)
00179 {
00180 return left_view_helper(s, n);
00181 }
00182
00187 inline basic_string_view<ss_char_w_t> left_view(ss_char_w_t const* s, ss_size_t n)
00188 {
00189 return left_view_helper(s, n);
00190 }
00191
00192 template <ss_typename_param_k S>
00193 inline ss_typename_type_ret_k string_view_helper_traits<S>::view_type left_view(S const& s, ss_size_t n)
00194 {
00195 typedef string_view_helper_traits<S> traits_t;
00196 typedef ss_typename_type_k traits_t::view_type view_t;
00197
00198 const ss_size_t len = stlsoft_ns_qual(c_str_len)(s);
00199
00200 if(n > len)
00201 {
00202
00203 n = len;
00204 }
00205
00206 return view_t(s.data(), n);
00207 }
00208
00209 #ifndef STLSOFT_DOCUMENTATION_SKIP_SECTION
00210 template <ss_typename_param_k C>
00211 inline basic_string_view<C> right_view_helper(C const* s, ss_size_t n)
00212 {
00213 const ss_size_t len = stlsoft_ns_qual(c_str_len)(s);
00214
00215 if(n > len)
00216 {
00217
00218 n = len;
00219 }
00220 else
00221 {
00222
00223 s += (len - n);
00224 }
00225
00226 return basic_string_view<C>(s, n);
00227 }
00228 #endif
00229
00234 inline basic_string_view<ss_char_a_t> right_view(ss_char_a_t const* s, ss_size_t n)
00235 {
00236 return right_view_helper(s, n);
00237 }
00238
00243 inline basic_string_view<ss_char_w_t> right_view(ss_char_w_t const* s, ss_size_t n)
00244 {
00245 return right_view_helper(s, n);
00246 }
00247
00248 template <ss_typename_param_k S>
00249 inline ss_typename_type_ret_k string_view_helper_traits<S>::view_type right_view(S const& s, ss_size_t n)
00250 {
00251 typedef string_view_helper_traits<S> traits_t;
00252 typedef ss_typename_type_k traits_t::view_type view_t;
00253
00254 const ss_size_t len = stlsoft_ns_qual(c_str_len)(s);
00255 ss_size_t off = 0;
00256
00257 if(n > len)
00258 {
00259
00260 n = len;
00261 }
00262 else
00263 {
00264 off = len - n;
00265 }
00266
00267 return view_t(s.data() + off, n);
00268 }
00269
00270 #ifndef STLSOFT_DOCUMENTATION_SKIP_SECTION
00271 template <ss_typename_param_k C>
00272 inline basic_string_view<C> mid_view_helper(C const* s, ss_size_t start, ss_size_t n)
00273 {
00274 const ss_size_t len = stlsoft_ns_qual(c_str_len)(s);
00275 ss_size_t off = 0;
00276
00277 if(start > len)
00278 {
00279
00280 off = len;
00281 }
00282 else
00283 {
00284 off = start;
00285 }
00286
00287 if(off + n > len)
00288 {
00289
00290 n = len - off;
00291 }
00292
00293 return basic_string_view<C>(s + off, n);
00294 }
00295 #endif
00296
00301 inline basic_string_view<ss_char_a_t> mid_view(ss_char_a_t const* s, ss_size_t start, ss_size_t n)
00302 {
00303 return mid_view_helper(s, start, n);
00304 }
00305
00310 inline basic_string_view<ss_char_w_t> mid_view(ss_char_w_t const* s, ss_size_t start, ss_size_t n)
00311 {
00312 return mid_view_helper(s, start, n);
00313 }
00314
00315 template <ss_typename_param_k S>
00316 inline ss_typename_type_ret_k string_view_helper_traits<S>::view_type mid_view(S const& s, ss_size_t start, ss_size_t n)
00317 {
00318 typedef string_view_helper_traits<S> traits_t;
00319 typedef ss_typename_type_k traits_t::view_type view_t;
00320
00321 const ss_size_t len = stlsoft_ns_qual(c_str_len)(s);
00322 ss_size_t off = 0;
00323
00324 if(start > len)
00325 {
00326
00327 off = len;
00328 }
00329 else
00330 {
00331 off = start;
00332 }
00333
00334 if(off + n > len)
00335 {
00336
00337 n = len - off;
00338 }
00339
00340 return view_t(s.data() + off, n);
00341 }
00342
00344
00345
00346 #ifdef STLSOFT_UNITTEST
00347 # include "./unittest/view_slice_functions_unittest_.h"
00348 #endif
00349
00350
00351
00352 #ifndef _STLSOFT_NO_NAMESPACE
00353 }
00354 #endif
00355
00356
00357
00358 #endif
00359
00360