42#define MAX_LOOPS 100000
94#ifndef _RWSTD_NO_WCHAR_T
104template <
class charT,
class Traits>
105struct MyIos: std::basic_ios<charT, Traits>
113template <
class charT,
class Traits>
114struct MyStreambuf: std::basic_streambuf<charT, Traits>
116 typedef std::basic_streambuf<charT, Traits>
Base;
129 this->setp (pbeg, pbeg +
n);
144#define RW_ASSERT_FIELDS(a,b) verify_fields(a,b)
159#ifndef _RWSTD_NO_WCHAR_T
165 std::ios_base::iostate state = std::ios_base::goodbit;
179 const std::locale
loc =
181 : std::locale (
data.locale_name_);
186 const std::time_get<char> &ng =
187 std::use_facet<std::time_get<char> >(
loc);
192 const std::istreambuf_iterator<char> iter (&nsb);
193 const std::istreambuf_iterator<char>
end;
195 std::memset (&local, 0,
sizeof local);
197 switch (
data.format_) {
199 ng.get_time (iter,
end, nio, state, &local);
202 ng.get_date (iter,
end, nio, state, &local);
206 ng.get_weekday (iter,
end, nio, state, &local);
210 ng.get_monthname (iter,
end, nio, state, &local);
214 ng.get_year (iter,
end, nio, state, &local);
218#ifndef _RWSTD_NO_EXT_TIME_GET
219 ng.get (iter,
end, nio, state, &local,
data.format_);
225 RW_ASSERT (! (state & std::ios_base::failbit));
234#ifndef _RWSTD_NO_WCHAR_T
236 const std::time_get<wchar_t> &wg =
237 std::use_facet<std::time_get<wchar_t> >(
loc);
242 const std::istreambuf_iterator<wchar_t> iter (&wsb);
243 const std::istreambuf_iterator<wchar_t>
end;
245 std::memset (&local, 0,
sizeof local);
247 switch (
data.format_) {
249 wg.get_time (iter,
end, wio, state, &local);
252 wg.get_date (iter,
end, wio, state, &local);
256 wg.get_weekday (iter,
end, wio, state, &local);
260 wg.get_monthname (iter,
end, wio, state, &local);
264 wg.get_year (iter,
end, wio, state, &local);
268#ifndef _RWSTD_NO_EXT_TIME_GET
269 wg.get (iter,
end, wio, state, &local,
data.format_);
275 RW_ASSERT (! (state & std::ios_base::failbit));
297#ifndef _RWSTD_NO_WCHAR_T
322 std::memset (&
data.time_, 0,
sizeof data.time_);
323 data.time_.tm_sec = ++
j % 61;
324 data.time_.tm_min = ++
j % 60;
325 data.time_.tm_hour = ++
j % 12;
326 data.time_.tm_wday = ++
j % 7;
327 data.time_.tm_mon = ++
j % 12;
328 data.time_.tm_mday = ++
j % 31;
329 data.time_.tm_yday = ++
j % 366;
330 data.time_.tm_year = ++
j;
332#ifndef _RWSTD_NO_EXT_TIME_GET
336 const char formats [] =
"aAbBCdhHjmMnRStTwxXyY";
341 const char formats [] =
"aAbBxXyY";
345 data.format_ = formats [
nlocales % (
sizeof formats - 1)];
348 const std::locale
loc (
data.locale_name_);
350 const std::time_put<char> &np =
351 std::use_facet<std::time_put<char> >(
loc);
353 const std::time_get<char> &ng =
354 std::use_facet<std::time_get<char> >(
loc);
356 std::ios::iostate state = std::ios::goodbit;
362 *np.put (std::ostreambuf_iterator<char>(&nsb), nio,
' ',
365 rw_fatal (!nio.fail (), __FILE__, __LINE__,
366 "time_put<char>::put(...) failed for locale(%#s)",
374 const std::istreambuf_iterator<char> iter (&nsb);
375 const std::istreambuf_iterator<char>
end;
377 std::memset (&
data.time_, 0,
sizeof data.time_);
379 switch (
data.format_) {
382 ng.get_weekday (iter, end, nio, state, &
data.time_);
387 ng.get_monthname (iter, end, nio, state, &
data.time_);
391 ng.get_year (iter, end, nio, state, &
data.time_);
394 ng.get_date (iter, end, nio, state, &
data.time_);
397 ng.get_time (iter, end, nio, state, &
data.time_);
401#ifndef _RWSTD_NO_EXT_TIME_GET
402 ng.get (iter, end, nio, state, &
data.time_,
data.format_);
409 if (state & std::ios_base::failbit)
412#ifndef _RWSTD_NO_WCHAR_T
414 const std::time_put<wchar_t> &wp =
415 std::use_facet<std::time_put<wchar_t> >(
loc);
420 *wp.put (std::ostreambuf_iterator<wchar_t>(&wsb),
421 wio,
L' ', &
data.time_,
data.format_) =
L'\0';
423 rw_fatal (!wio.fail (), __FILE__, __LINE__,
424 "time_put<wchar_t>::put(...) failed for locale(%#s)",
437 "failed to create locale(%#s)",
name);
440 if (nlocales == maxinx || nlocales == std::size_t (
opt_nlocales))
445 rw_fatal (nlocales != 0, 0, __LINE__,
446 "failed to create one or more usable locales!");
449 "testing std::time_get<charT> with %d thread%{?}s%{;}, "
450 "%d iteration%{?}s%{;} each, in %zu locales { %{ .*A@} }",
453 nlocales,
int (nlocales),
"%#s", locales);
455 rw_info (0, 0, 0,
"exercising std::time_get<char>");
466 "rw_thread_pool(0, %d, 0, %{#f}, 0) failed",
469#ifndef _RWSTD_NO_WCHAR_T
471 rw_info (0, 0, 0,
"exercising std::time_get<wchar_t>");
482 "rw_thread_pool(0, %d, 0, %{#f}, 0) failed",
489 "exercising both std::time_get<char> and std::time_get<wchar_t>");
500 "rw_thread_pool(0, %d, 0, %{#f}, 0) failed",
510int main (
int argc,
char *argv[])
512#ifdef _RWSTD_REENTRANT
522 return rw_test (argc, argv, __FILE__,
523 "lib.locale.time.get",
#define RW_ASSERT_FIELDS(a, b)
struct MyTimeData my_time_data[MAX_THREADS]
void verify_fields(const std::tm &a, const std::tm &b)
void run_test(const ForwardIterator &dummy, T *, Predicate *pred)
#define _RWSTD_CONST_CAST(T, x)
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()
void pubsetg(charT *beg, charT *cur, charT *end)
std::basic_streambuf< charT, Traits > Base
void pubsetp(charT *beg, charT *cur, charT *end)
void pubsetp(charT *pbeg, std::streamsize n)
void pubsetg(const charT *gbeg, std::streamsize n)
const char * locale_name_