44#define MAX_LOOPS 100000
77template <
class internT>
84 typedef std::codecvt_base::result
resultT;
129template <
class charT>
150 {
L"\x0905\x0916", 2 },
154 {
L"\xd800\xd801", 2 },
156 {
L"\xdfff\xffff", 2 },
159 {
L"jjjjjjjjjj", 10 },
160 {
L"kkkkkkkkkkk", 11 }
179template <
class internT>
187 typedef char externT;
188 typedef std::mbstate_t stateT;
189 typedef std::size_t sizeT;
191 typedef std::codecvt<internT, externT, stateT> code_cvt_type;
193 const code_cvt_type&
cvt =
194 std::use_facet<code_cvt_type>(
loc);
200 out_buffer [0] = externT ();
204 const internT* from =
in.str;
205 const internT* from_end =
in.str +
in.str_len;
206 const internT* from_next = 0;
208 externT* to = out_buffer;
209 externT* to_limit = out_buffer + out_len;
210 externT* to_next = 0;
212 std::mbstate_t state = std::mbstate_t ();
215 cvt.out (state, from, from_end, from_next,
216 to, to_limit, to_next);
218 const sizeT
len = to_next - to;
228 out_buffer [0] = externT ();
232 externT* to = out_buffer;
233 externT* to_limit = out_buffer + out_len;
234 externT* to_next = 0;
236 std::mbstate_t state = std::mbstate_t ();
239 cvt.unshift (state, to, to_limit, to_next);
246 ||
result == std::codecvt_base::noconv);
252 in_buffer [0] = internT ();
257 const externT* from =
data.out_buffer_;
258 const externT* from_end =
data.out_buffer_ + out_len;
259 const externT* from_next = 0;
261 internT* to = in_buffer;
262 internT* to_limit = in_buffer + in_len;
263 internT* to_next = 0;
265 std::mbstate_t state = std::mbstate_t ();
268 cvt.in (state, from, from_end, from_next,
269 to, to_limit, to_next);
271 const sizeT
len = to_next - to;
284 const externT* from =
out.str;
285 const externT* from_end =
out.str +
out.str_len;
286 const size_t max = 32;
288 std::mbstate_t state = std::mbstate_t ();
290 const sizeT
len =
cvt.length (state, from, from_end,
max);
330 const std::locale
loc =
332 : std::locale (
data.locale_name_);
339 data.char_data_, op);
344 data.wchar_data_, op);
355template <
class internT>
362 typedef char externT;
363 typedef std::mbstate_t stateT;
365 typedef std::codecvt<internT, externT, stateT> code_cvt_type;
367 const code_cvt_type&
cvt =
368 std::use_facet<code_cvt_type>(
loc);
371 data.encoding_ =
cvt.encoding ();
372 data.max_length_ =
cvt.max_length ();
373 data.always_noconv_ =
cvt.always_noconv ();
377 const externT* from =
out.str;
378 const externT* from_end =
out.str +
out.str_len;
379 const size_t max = 32;
381 std::mbstate_t state = std::mbstate_t ();
383 data.length_ =
cvt.length (state, from, from_end,
max);
390 const internT* from =
in.str;
391 const internT* from_end =
in.str +
in.str_len;
392 const internT* from_next = 0;
394 externT* to =
data.out_buffer_;
395 externT* to_limit =
data.out_buffer_ + out_len;
396 externT* to_next = 0;
399 from, from_end, from_next,
400 to, to_limit, to_next);
402 data.out_length_ = to_next - to;
421 const externT* from =
data.out_buffer_;
422 const externT* from_end =
data.out_buffer_ + out_len;
423 const externT* from_next = 0;
425 internT* to =
data.in_buffer_;
426 internT* to_limit =
data.in_buffer_ + in_len;
427 internT* to_next = 0;
430 from, from_end, from_next,
431 to, to_limit, to_next);
433 data.in_length_ = to_next - to;
461 const std::locale
loc (
data.locale_name_);
466 run_test_fill<wchar_t>
477 "failed to create locale(%#s)",
name);
480 if (nlocales == maxinx || nlocales == std::size_t (
opt_nlocales))
485 rw_fatal (nlocales != 0, 0, __LINE__,
486 "failed to create one or more usable locales!");
489 "testing std::codecvt<charT> with %d thread%{?}s%{;}, "
490 "%d iteration%{?}s%{;} each, in %zu locales { %{ .*A@} }",
493 nlocales,
int (nlocales),
"%#s", locales);
497 rw_info (0, 0, 0,
"exercising std::codecvt<char, char>");
508 "rw_thread_pool(0, %d, 0, %{#f}, 0) failed",
513 rw_info (0, 0, 0,
"exercising std::codecvt<wchar_t, char>");
523 "rw_thread_pool(0, %d, 0, %{#f}, 0) failed",
528 rw_info (0, 0, 0,
"exercising std::codecvt<char, char> and "
529 "std::codecvt<wchar_t, char>");
539 "rw_thread_pool(0, %d, 0, %{#f}, 0) failed",
547int main (
int argc,
char *argv[])
549#ifdef _RWSTD_REENTRANT
559 return rw_test (argc, argv, __FILE__,
560 "lib.locale.codecvt",
void run_test_fill(const std::locale &loc, const MyBuffer< internT > &in, const MyBuffer< char > &out, MyCodecvtData_T< internT > &data)
void test_codecvt(const std::locale &loc, const MyBuffer< internT > &in, const MyBuffer< char > &out, const MyCodecvtData_T< internT > &data, const MyCodecvtData::CvtId id)
struct MyCodecvtData my_codecvt_data[MAX_THREADS]
const MyBuffer< char > nsrc[]
const MyBuffer< wchar_t > wsrc[]
void run_test(const ForwardIterator &dummy, T *, Predicate *pred)
const struct @19 locales[]
_TEST_EXPORT int rw_test(int argc, char *argv[], const char *filename, const char *clause, const char *comment, int(*testfun)(int, char **), const char *optspec,...)
_TEST_EXPORT int rw_info(int, const char *, int, const char *,...)
_TEST_EXPORT int rw_fatal(int expr, const char *filename, int line, const char *fmtspec,...)
_TEST_EXPORT int rw_error(int, const char *, int, const char *,...)
_TEST_EXPORT int rw_warn(int, const char *, int, const char *,...)
_TEST_EXPORT int rw_opt_setlocales(int, char *[])
_TEST_EXPORT const char *const & rw_opt_locales
_TEST_EXPORT char * rw_locales(int=_UNUSED_CAT, const char *=0, bool=true)
_TEST_EXPORT int rw_thread_pool(rw_thread_t *, _RWSTD_SIZE_T, rw_thread_attr_t *, rw_thread_proc *, void **, _RWSTD_SIZE_T=0)
_TEST_EXPORT int rw_get_cpus()
_TEST_EXPORT int rw_thread_pool_timeout_expired()
_TEST_EXPORT int rw_strncmp(const char *, const char *, _RWSTD_SIZE_T=_RWSTD_SIZE_MAX, int=CMP_NULTERM)
internT in_buffer_[BufferSize]
externT out_buffer_[BufferSize]
std::codecvt_base::result resultT
MyCodecvtData_T< char > char_data_
const char * locale_name_
MyCodecvtData_T< wchar_t > wchar_data_