41#define MAX_LOOPS 100000
50#if !defined (_RWSTD_OS_HP_UX) || defined (_ILP32)
90#ifndef _RWSTD_NO_LONG_LONG
99#ifndef _RWSTD_NO_LONG_DOUBLE
126#ifndef _RWSTD_NO_WCHAR_T
137template <
class charT,
class Traits>
138struct MyIos: std::basic_ios<charT, Traits>
145template <
class charT,
class Traits>
146struct MyStreambuf: std::basic_streambuf<charT, Traits>
148 typedef std::basic_streambuf<charT, Traits>
Base;
161 this->setp (pbeg, pbeg +
n);
165template <
class charT,
class Traits>
168 const std::num_put<charT> &np,
169 const std::ostreambuf_iterator<charT, Traits> &iter,
170 std::basic_ios<charT, Traits> &io,
174 switch (
data.type_) {
176 *np.put (iter, io,
fill,
177 data.value_ < 1.f) = term;
180 *np.put (iter, io,
fill,
181 (
long)
data.value_) = term;
184 *np.put (iter, io,
fill,
185 (
unsigned long)
data.value_) = term;
188#ifndef _RWSTD_NO_LONG_LONG
191 *np.put (iter, io,
fill,
195 *np.put (iter, io,
fill,
202 *np.put (iter, io,
fill,
203 (
double)
data.value_) = term;
207#ifndef _RWSTD_NO_LONG_DOUBLE
210 *np.put (iter, io,
fill,
211 (
long double)
data.value_) = term;
217 *np.put (iter, io,
fill,
218 (
const void*)&
data.value_) = term;
229template <
class charT,
class Traits>
232 const std::num_get<charT> &ng,
233 const std::istreambuf_iterator<charT, Traits> &iter,
234 const std::istreambuf_iterator<charT, Traits> &end,
235 std::basic_ios<charT, Traits> &io)
237 std::ios_base::iostate state = std::ios_base::goodbit;
239 switch (
data.type_) {
241 const bool expected =
data.value_ < 1.f;
243 ng.get (iter,
end, io, state, checked);
244 RW_ASSERT (! (state & std::ios_base::failbit));
249 const long expected = (long)
data.value_;
251 ng.get (iter,
end, io, state, checked);
252 RW_ASSERT (! (state & std::ios_base::failbit));
257 const unsigned long expected = (
unsigned long)
data.value_;
258 unsigned long checked;
259 ng.get (iter,
end, io, state, checked);
260 RW_ASSERT (! (state & std::ios_base::failbit));
265#ifndef _RWSTD_NO_LONG_LONG
270 ng.get (iter,
end, io, state, checked);
271 RW_ASSERT (! (state & std::ios_base::failbit));
279 ng.get (iter,
end, io, state, checked);
280 RW_ASSERT (! (state & std::ios_base::failbit));
288 const double expected = (double)
data.value_;
290 ng.get (iter,
end, io, state, checked);
291 RW_ASSERT (! (state & std::ios_base::failbit));
296#ifndef _RWSTD_NO_LONG_DOUBLE
299 const long double expected = (
long double)
data.value_;
301 ng.get (iter,
end, io, state, checked);
302 RW_ASSERT (! (state & std::ios_base::failbit));
310 const void* expected = (
const void*)&
data.value_;
312 ng.get (iter,
end, io, state, checked);
313 RW_ASSERT (! (state & std::ios_base::failbit));
334 typedef std::char_traits<char>
Traits;
339#ifndef _RWSTD_NO_WCHAR_T
340 typedef std::char_traits<wchar_t> WTraits;
356 const std::locale
loc =
358 : std::locale (
data.locale_name_);
363 const std::num_get<char> &ng =
364 std::use_facet<std::num_get<char> >(
loc);
370 std::istreambuf_iterator<char>(&nsb),
371 std::istreambuf_iterator<char>(),
382#ifndef _RWSTD_NO_WCHAR_T
384 const std::num_get<wchar_t> &wp =
385 std::use_facet<std::num_get<wchar_t> >(
loc);
391 std::istreambuf_iterator<wchar_t>(&wsb),
392 std::istreambuf_iterator<wchar_t>(),
417#ifndef _RWSTD_NO_WCHAR_T
441 const std::locale
loc (
data.locale_name_);
447 const std::num_put<char> &np =
448 std::use_facet<std::num_put<char> >(
loc);
456 data.nlen_ = std::char_traits<char>::length (
data.ncs_);
458 rw_fatal (!nio.fail (), __FILE__, __LINE__,
459 "num_put<char>::put(...) failed for locale(%#s)",
462#ifndef _RWSTD_NO_WCHAR_T
464 const std::num_put<wchar_t> &wp =
465 std::use_facet<std::num_put<wchar_t> >(
loc);
473 data.wlen_ = std::char_traits<wchar_t>::length (
data.wcs_);
475 rw_fatal (!wio.fail (), __FILE__, __LINE__,
476 "num_put<wchar_t>::put(...) failed for locale(%#s)",
488 "failed to create locale(%#s)",
name);
491 if (nlocales == maxinx || nlocales == std::size_t (
opt_nlocales))
496 rw_fatal (nlocales != 0, 0, __LINE__,
497 "failed to create one or more usable locales!");
500 "testing std::num_get<charT> with %d thread%{?}s%{;}, "
501 "%d iteration%{?}s%{;} each, in %zu locales { %{ .*A@} }",
504 nlocales,
int (nlocales),
"%#s", locales);
506 rw_info (0, 0, 0,
"exercising std::num_get<char>");
517 "rw_thread_pool(0, %d, 0, %{#f}, 0) failed",
520#ifndef _RWSTD_NO_WCHAR_T
522 rw_info (0, 0, 0,
"exercising std::num_get<wchar_t>");
533 "rw_thread_pool(0, %d, 0, %{#f}, 0) failed",
540 "exercising both std::num_get<char> and std::num_get<wchar_t>");
551 "rw_thread_pool(0, %d, 0, %{#f}, 0) failed",
561int main (
int argc,
char *argv [])
563#ifdef _RWSTD_REENTRANT
573 return rw_test (argc, argv, __FILE__,
574 "lib.locale.num.get",
void test_get_data(const MyNumData &data, const std::num_get< charT > &ng, const std::istreambuf_iterator< charT, Traits > &iter, const std::istreambuf_iterator< charT, Traits > &end, std::basic_ios< charT, Traits > &io)
void test_put_data(const MyNumData &data, const std::num_put< charT > &np, const std::ostreambuf_iterator< charT, Traits > &iter, std::basic_ios< charT, Traits > &io, charT fill, charT term)
struct MyNumData my_num_data[MAX_THREADS]
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()
const char * locale_name_
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)