Changes imported from Abseil "staging" branch:

- 5d8235b05f4ea2b33a138712f463a30b6ae75719 Incorporate PR https://github.com/abseil/abseil-cpp/pull/... by Xiaoyi Zhang <zhangxy@google.com>
  - f2bc653acdaa983aa2765693476c17cd1142d59b Run the StrSplit WorksWithLargeStrings test in all configs. by Matt Armstrong <marmstrong@google.com>
  - 43aed1ea7dffcd656e1916c2d5637650fc3a8de3 Incorporate PR https://github.com/abseil/abseil-cpp/pull/... by Xiaoyi Zhang <zhangxy@google.com>
  - d58511d60904c7090e44638339ba63b97ca96f1a Add a new simple Mutex lifetime test, to be extended later. by Greg Falcon <gfalcon@google.com>
  - db5c86c186c09ad57963bcbd2b6182f62bce8ed0 Actually use the exception in TestCheckerAtCountdown by Jon Cohen <cohenjon@google.com>
  - 29c01a72b62d9a4b90f9bd935e3575adbafd85ed Use factories instead of explicitly passing pointers to T... by Jon Cohen <cohenjon@google.com>
  - 54d5526ee6ab7784992845f6e6e2c7d48ba008a5 Fix uint128 ostream operator and improve ostream test. by Alex Strelnikov <strel@google.com>
  - 4e49abe7e569cf6bd0eae95ce2b2fe2faa051fa2 Fix documentation: strings::PairFormatter -> absl::PairFo... by Derek Mauro <dmauro@google.com>
  - 4044297f0e1a8a6c6ae3f781a65080e0d57c6751 Cut the memory used by the StrSplit WorksWithLargeStrings... by Jorg Brown <jorg@google.com>

GitOrigin-RevId: 5d8235b05f4ea2b33a138712f463a30b6ae75719
Change-Id: Ib6b6b0161c26e5326b53a126454754e33678eefc
This commit is contained in:
Abseil Team 2017-12-01 12:15:49 -08:00 committed by Xiaoyi Zhang
parent 579f2879ac
commit 8b727aa7ab
11 changed files with 1207 additions and 269 deletions

View file

@ -241,6 +241,7 @@ cc_library(
"//absl/memory", "//absl/memory",
"//absl/meta:type_traits", "//absl/meta:type_traits",
"//absl/strings", "//absl/strings",
"//absl/types:optional",
"@com_google_googletest//:gtest", "@com_google_googletest//:gtest",
], ],
) )

View file

@ -384,70 +384,62 @@ struct CallOperator {
} }
}; };
struct FailsBasicGuarantee { struct NonNegative {
friend testing::AssertionResult AbslCheckInvariants(NonNegative* g) {
if (g->i >= 0) return testing::AssertionSuccess();
return testing::AssertionFailure()
<< "i should be non-negative but is " << g->i;
}
bool operator==(const NonNegative& other) const { return i == other.i; }
int i;
};
template <typename T>
struct DefaultFactory {
std::unique_ptr<T> operator()() const { return absl::make_unique<T>(); }
};
struct FailsBasicGuarantee : public NonNegative {
void operator()() { void operator()() {
--i; --i;
ThrowingValue<> bomb; ThrowingValue<> bomb;
++i; ++i;
} }
bool operator==(const FailsBasicGuarantee& other) const {
return i == other.i;
}
friend testing::AssertionResult AbslCheckInvariants(
const FailsBasicGuarantee& g) {
if (g.i >= 0) return testing::AssertionSuccess();
return testing::AssertionFailure()
<< "i should be non-negative but is " << g.i;
}
int i = 0;
}; };
TEST(ExceptionCheckTest, BasicGuaranteeFailure) { TEST(ExceptionCheckTest, BasicGuaranteeFailure) {
FailsBasicGuarantee g; EXPECT_FALSE(TestExceptionSafety(DefaultFactory<FailsBasicGuarantee>(),
EXPECT_FALSE(TestExceptionSafety(&g, CallOperator{})); CallOperator{}));
} }
struct FollowsBasicGuarantee { struct FollowsBasicGuarantee : public NonNegative {
void operator()() { void operator()() {
++i; ++i;
ThrowingValue<> bomb; ThrowingValue<> bomb;
} }
bool operator==(const FollowsBasicGuarantee& other) const {
return i == other.i;
}
friend testing::AssertionResult AbslCheckInvariants(
const FollowsBasicGuarantee& g) {
if (g.i >= 0) return testing::AssertionSuccess();
return testing::AssertionFailure()
<< "i should be non-negative but is " << g.i;
}
int i = 0;
}; };
TEST(ExceptionCheckTest, BasicGuarantee) { TEST(ExceptionCheckTest, BasicGuarantee) {
FollowsBasicGuarantee g; EXPECT_TRUE(TestExceptionSafety(DefaultFactory<FollowsBasicGuarantee>(),
EXPECT_TRUE(TestExceptionSafety(&g, CallOperator{})); CallOperator{}));
} }
TEST(ExceptionCheckTest, StrongGuaranteeFailure) { TEST(ExceptionCheckTest, StrongGuaranteeFailure) {
{ {
FailsBasicGuarantee g; DefaultFactory<FailsBasicGuarantee> factory;
EXPECT_FALSE(TestExceptionSafety(&g, CallOperator{}, StrongGuarantee(g))); EXPECT_FALSE(
TestExceptionSafety(factory, CallOperator{}, StrongGuarantee(factory)));
} }
{ {
FollowsBasicGuarantee g; DefaultFactory<FollowsBasicGuarantee> factory;
EXPECT_FALSE(TestExceptionSafety(&g, CallOperator{}, StrongGuarantee(g))); EXPECT_FALSE(
TestExceptionSafety(factory, CallOperator{}, StrongGuarantee(factory)));
} }
} }
struct BasicGuaranteeWithExtraInvariants { struct BasicGuaranteeWithExtraInvariants : public NonNegative {
// After operator(), i is incremented. If operator() throws, i is set to 9999 // After operator(), i is incremented. If operator() throws, i is set to 9999
void operator()() { void operator()() {
int old_i = i; int old_i = i;
@ -456,92 +448,94 @@ struct BasicGuaranteeWithExtraInvariants {
i = ++old_i; i = ++old_i;
} }
bool operator==(const FollowsBasicGuarantee& other) const {
return i == other.i;
}
friend testing::AssertionResult AbslCheckInvariants(
const BasicGuaranteeWithExtraInvariants& g) {
if (g.i >= 0) return testing::AssertionSuccess();
return testing::AssertionFailure()
<< "i should be non-negative but is " << g.i;
}
int i = 0;
static constexpr int kExceptionSentinel = 9999; static constexpr int kExceptionSentinel = 9999;
}; };
constexpr int BasicGuaranteeWithExtraInvariants::kExceptionSentinel; constexpr int BasicGuaranteeWithExtraInvariants::kExceptionSentinel;
TEST(ExceptionCheckTest, BasicGuaranteeWithInvariants) { TEST(ExceptionCheckTest, BasicGuaranteeWithInvariants) {
{ DefaultFactory<BasicGuaranteeWithExtraInvariants> factory;
BasicGuaranteeWithExtraInvariants g;
EXPECT_TRUE(TestExceptionSafety(&g, CallOperator{})); EXPECT_TRUE(TestExceptionSafety(factory, CallOperator{}));
}
{
BasicGuaranteeWithExtraInvariants g;
EXPECT_TRUE(TestExceptionSafety( EXPECT_TRUE(TestExceptionSafety(
&g, CallOperator{}, [](const BasicGuaranteeWithExtraInvariants& w) { factory, CallOperator{}, [](BasicGuaranteeWithExtraInvariants* w) {
if (w.i == BasicGuaranteeWithExtraInvariants::kExceptionSentinel) { if (w->i == BasicGuaranteeWithExtraInvariants::kExceptionSentinel) {
return testing::AssertionSuccess(); return testing::AssertionSuccess();
} }
return testing::AssertionFailure() return testing::AssertionFailure()
<< "i should be " << "i should be "
<< BasicGuaranteeWithExtraInvariants::kExceptionSentinel << BasicGuaranteeWithExtraInvariants::kExceptionSentinel
<< ", but is " << w.i; << ", but is " << w->i;
})); }));
}
} }
struct FollowsStrongGuarantee { struct FollowsStrongGuarantee : public NonNegative {
void operator()() { ThrowingValue<> bomb; } void operator()() { ThrowingValue<> bomb; }
bool operator==(const FollowsStrongGuarantee& other) const {
return i == other.i;
}
friend testing::AssertionResult AbslCheckInvariants(
const FollowsStrongGuarantee& g) {
if (g.i >= 0) return testing::AssertionSuccess();
return testing::AssertionFailure()
<< "i should be non-negative but is " << g.i;
}
int i = 0;
}; };
TEST(ExceptionCheckTest, StrongGuarantee) { TEST(ExceptionCheckTest, StrongGuarantee) {
FollowsStrongGuarantee g; DefaultFactory<FollowsStrongGuarantee> factory;
EXPECT_TRUE(TestExceptionSafety(&g, CallOperator{})); EXPECT_TRUE(TestExceptionSafety(factory, CallOperator{}));
EXPECT_TRUE(TestExceptionSafety(&g, CallOperator{}, StrongGuarantee(g))); EXPECT_TRUE(
TestExceptionSafety(factory, CallOperator{}, StrongGuarantee(factory)));
} }
struct NonCopyable { struct HasReset : public NonNegative {
NonCopyable(const NonCopyable&) = delete; void operator()() {
explicit NonCopyable(int ii) : i(ii) {} i = -1;
ThrowingValue<> bomb;
void operator()() { ThrowingValue<> bomb; } i = 1;
bool operator==(const NonCopyable& other) const { return i == other.i; }
friend testing::AssertionResult AbslCheckInvariants(const NonCopyable& g) {
if (g.i >= 0) return testing::AssertionSuccess();
return testing::AssertionFailure()
<< "i should be non-negative but is " << g.i;
} }
int i; void reset() { i = 0; }
friend bool AbslCheckInvariants(HasReset* h) {
h->reset();
return h->i == 0;
}
};
TEST(ExceptionCheckTest, ModifyingChecker) {
{
DefaultFactory<FollowsBasicGuarantee> factory;
EXPECT_FALSE(TestExceptionSafety(
factory, CallOperator{},
[](FollowsBasicGuarantee* g) {
g->i = 1000;
return true;
},
[](FollowsBasicGuarantee* g) { return g->i == 1000; }));
}
{
DefaultFactory<FollowsStrongGuarantee> factory;
EXPECT_TRUE(TestExceptionSafety(factory, CallOperator{},
[](FollowsStrongGuarantee* g) {
++g->i;
return true;
},
StrongGuarantee(factory)));
}
{
DefaultFactory<HasReset> factory;
EXPECT_TRUE(TestExceptionSafety(factory, CallOperator{}));
}
}
struct NonCopyable : public NonNegative {
NonCopyable(const NonCopyable&) = delete;
NonCopyable() : NonNegative{0} {}
void operator()() { ThrowingValue<> bomb; }
}; };
TEST(ExceptionCheckTest, NonCopyable) { TEST(ExceptionCheckTest, NonCopyable) {
NonCopyable g(0); DefaultFactory<NonCopyable> factory;
EXPECT_TRUE(TestExceptionSafety(&g, CallOperator{})); EXPECT_TRUE(TestExceptionSafety(factory, CallOperator{}));
EXPECT_TRUE(TestExceptionSafety( EXPECT_TRUE(
&g, CallOperator{}, TestExceptionSafety(factory, CallOperator{}, StrongGuarantee(factory)));
PointeeStrongGuarantee(absl::make_unique<NonCopyable>(g.i))));
} }
struct NonEqualityComparable { struct NonEqualityComparable : public NonNegative {
void operator()() { ThrowingValue<> bomb; } void operator()() { ThrowingValue<> bomb; }
void ModifyOnThrow() { void ModifyOnThrow() {
@ -550,71 +544,61 @@ struct NonEqualityComparable {
static_cast<void>(bomb); static_cast<void>(bomb);
--i; --i;
} }
friend testing::AssertionResult AbslCheckInvariants(
const NonEqualityComparable& g) {
if (g.i >= 0) return testing::AssertionSuccess();
return testing::AssertionFailure()
<< "i should be non-negative but is " << g.i;
}
int i = 0;
}; };
TEST(ExceptionCheckTest, NonEqualityComparable) { TEST(ExceptionCheckTest, NonEqualityComparable) {
NonEqualityComparable g; DefaultFactory<NonEqualityComparable> factory;
auto comp = [](const NonEqualityComparable& a, auto comp = [](const NonEqualityComparable& a,
const NonEqualityComparable& b) { return a.i == b.i; }; const NonEqualityComparable& b) { return a.i == b.i; };
EXPECT_TRUE(TestExceptionSafety(&g, CallOperator{})); EXPECT_TRUE(TestExceptionSafety(factory, CallOperator{}));
EXPECT_TRUE( EXPECT_TRUE(TestExceptionSafety(factory, CallOperator{},
TestExceptionSafety(&g, CallOperator{}, absl::StrongGuarantee(g, comp))); absl::StrongGuarantee(factory, comp)));
EXPECT_FALSE(TestExceptionSafety( EXPECT_FALSE(TestExceptionSafety(
&g, [&](NonEqualityComparable* n) { n->ModifyOnThrow(); }, factory, [&](NonEqualityComparable* n) { n->ModifyOnThrow(); },
absl::StrongGuarantee(g, comp))); absl::StrongGuarantee(factory, comp)));
} }
template <typename T> template <typename T>
struct InstructionCounter { struct ExhaustivenessTester {
void operator()() { void operator()() {
++counter; successes |= 1;
T b1; T b1;
static_cast<void>(b1); static_cast<void>(b1);
++counter; successes |= (1 << 1);
T b2; T b2;
static_cast<void>(b2); static_cast<void>(b2);
++counter; successes |= (1 << 2);
T b3; T b3;
static_cast<void>(b3); static_cast<void>(b3);
++counter; successes |= (1 << 3);
} }
bool operator==(const InstructionCounter<ThrowingValue<>>&) const { bool operator==(const ExhaustivenessTester<ThrowingValue<>>&) const {
return true; return true;
} }
friend testing::AssertionResult AbslCheckInvariants( friend testing::AssertionResult AbslCheckInvariants(ExhaustivenessTester*) {
const InstructionCounter&) {
return testing::AssertionSuccess(); return testing::AssertionSuccess();
} }
static int counter; static unsigned char successes;
}; };
template <typename T> template <typename T>
int InstructionCounter<T>::counter = 0; unsigned char ExhaustivenessTester<T>::successes = 0;
TEST(ExceptionCheckTest, Exhaustiveness) { TEST(ExceptionCheckTest, Exhaustiveness) {
InstructionCounter<int> int_factory; DefaultFactory<ExhaustivenessTester<int>> int_factory;
EXPECT_TRUE(TestExceptionSafety(&int_factory, CallOperator{})); EXPECT_TRUE(TestExceptionSafety(int_factory, CallOperator{}));
EXPECT_EQ(InstructionCounter<int>::counter, 4); EXPECT_EQ(ExhaustivenessTester<int>::successes, 0xF);
InstructionCounter<ThrowingValue<>> bomb_factory; DefaultFactory<ExhaustivenessTester<ThrowingValue<>>> bomb_factory;
EXPECT_TRUE(TestExceptionSafety(&bomb_factory, CallOperator{})); EXPECT_TRUE(TestExceptionSafety(bomb_factory, CallOperator{}));
EXPECT_EQ(InstructionCounter<ThrowingValue<>>::counter, 10); EXPECT_EQ(ExhaustivenessTester<ThrowingValue<>>::successes, 0xF);
InstructionCounter<ThrowingValue<>>::counter = 0; ExhaustivenessTester<ThrowingValue<>>::successes = 0;
EXPECT_TRUE(TestExceptionSafety(&bomb_factory, CallOperator{}, EXPECT_TRUE(TestExceptionSafety(bomb_factory, CallOperator{},
StrongGuarantee(bomb_factory))); StrongGuarantee(bomb_factory)));
EXPECT_EQ(InstructionCounter<ThrowingValue<>>::counter, 10); EXPECT_EQ(ExhaustivenessTester<ThrowingValue<>>::successes, 0xF);
} }
struct LeaksIfCtorThrows : private exceptions_internal::TrackedObject { struct LeaksIfCtorThrows : private exceptions_internal::TrackedObject {

View file

@ -18,6 +18,7 @@
#include "absl/meta/type_traits.h" #include "absl/meta/type_traits.h"
#include "absl/strings/string_view.h" #include "absl/strings/string_view.h"
#include "absl/strings/substitute.h" #include "absl/strings/substitute.h"
#include "absl/types/optional.h"
namespace absl { namespace absl {
struct AllocInspector; struct AllocInspector;
@ -97,19 +98,50 @@ class TrackedObject {
friend struct ::absl::AllocInspector; friend struct ::absl::AllocInspector;
}; };
template <typename T, typename... Checkers> template <typename Factory>
testing::AssertionResult TestInvariants(const T& t, const TestException& e, using FactoryType = typename absl::result_of_t<Factory()>::element_type;
int count,
const Checkers&... checkers) {
auto out = AbslCheckInvariants(t);
// Don't bother with the checkers if the class invariants are already broken.
bool dummy[] = {true,
(out && (out = testing::AssertionResult(checkers(t))))...};
static_cast<void>(dummy);
return out ? out // Returns an optional with the result of the check if op fails, or an empty
: out << " Caused by exception " << count << "thrown by " // optional if op passes
<< e.what(); template <typename Factory, typename Op, typename Checker>
absl::optional<testing::AssertionResult> TestCheckerAtCountdown(
Factory factory, const Op& op, int count, const Checker& check) {
exceptions_internal::countdown = count;
auto t_ptr = factory();
absl::optional<testing::AssertionResult> out;
try {
op(t_ptr.get());
} catch (const exceptions_internal::TestException& e) {
out.emplace(check(t_ptr.get()));
if (!*out) {
*out << " caused by exception thrown by " << e.what();
}
}
return out;
}
template <typename Factory, typename Op, typename Checker>
int UpdateOut(Factory factory, const Op& op, int count, const Checker& checker,
testing::AssertionResult* out) {
if (*out) *out = *TestCheckerAtCountdown(factory, op, count, checker);
return 0;
}
// Returns an optional with the result of the check if op fails, or an empty
// optional if op passes
template <typename Factory, typename Op, typename... Checkers>
absl::optional<testing::AssertionResult> TestAtCountdown(
Factory factory, const Op& op, int count, const Checkers&... checkers) {
// Don't bother with the checkers if the class invariants are already broken.
auto out = TestCheckerAtCountdown(
factory, op, count,
[](FactoryType<Factory>* t_ptr) { return AbslCheckInvariants(t_ptr); });
if (!out.has_value()) return out;
// Run each checker, short circuiting after the first failure
int dummy[] = {0, (UpdateOut(factory, op, count, checkers, &*out))...};
static_cast<void>(dummy);
return out;
} }
template <typename T, typename EqualTo> template <typename T, typename EqualTo>
@ -118,8 +150,8 @@ class StrongGuaranteeTester {
explicit StrongGuaranteeTester(std::unique_ptr<T> t_ptr, EqualTo eq) noexcept explicit StrongGuaranteeTester(std::unique_ptr<T> t_ptr, EqualTo eq) noexcept
: val_(std::move(t_ptr)), eq_(eq) {} : val_(std::move(t_ptr)), eq_(eq) {}
testing::AssertionResult operator()(const T& other) const { testing::AssertionResult operator()(T* other) const {
return eq_(*val_, other) ? testing::AssertionSuccess() return eq_(*val_, *other) ? testing::AssertionSuccess()
: testing::AssertionFailure() << "State changed"; : testing::AssertionFailure() << "State changed";
} }
@ -673,58 +705,52 @@ T TestThrowingCtor(Args&&... args) {
} }
// Tests that performing operation Op on a T follows exception safety // Tests that performing operation Op on a T follows exception safety
// guarantees. By default only tests the basic guarantee. // guarantees. By default only tests the basic guarantee. There must be a
// function, AbslCheckInvariants(T*) which returns
// anything convertible to bool and which makes sure the invariants of the type
// are upheld. This is called before any of the checkers.
// //
// Parameters: // Parameters:
// * T: the type under test. // * TFactory: operator() returns a unique_ptr to the type under test (T). It
// should always return pointers to values which compare equal.
// * FunctionFromTPtrToVoid: A functor exercising the function under test. It // * FunctionFromTPtrToVoid: A functor exercising the function under test. It
// should take a T* and return void. // should take a T* and return void.
// * Checkers: Any number of functions taking a const T& and returning // * Checkers: Any number of functions taking a T* and returning
// anything contextually convertible to bool. If a testing::AssertionResult // anything contextually convertible to bool. If a testing::AssertionResult
// is used then the error message is kept. These test invariants related to // is used then the error message is kept. These test invariants related to
// the operation. To test the strong guarantee, pass // the operation. To test the strong guarantee, pass
// absl::StrongGuarantee(...) as one of these arguments if T has operator==. // absl::StrongGuarantee(factory). A checker may freely modify the passed-in
// Some types for which the strong guarantee makes sense don't have operator== // T, for example to make sure the T can be set to a known state.
// (eg std::any). A function capturing *t or a T equal to it, taking a const template <typename TFactory, typename FunctionFromTPtrToVoid,
// T&, and returning contextually-convertible-to-bool may be passed instead. typename... Checkers>
template <typename T, typename FunctionFromTPtrToVoid, typename... Checkers> testing::AssertionResult TestExceptionSafety(TFactory factory,
testing::AssertionResult TestExceptionSafety(T* t, FunctionFromTPtrToVoid&& op, FunctionFromTPtrToVoid&& op,
const Checkers&... checkers) { const Checkers&... checkers) {
auto out = testing::AssertionSuccess();
for (int countdown = 0;; ++countdown) { for (int countdown = 0;; ++countdown) {
exceptions_internal::countdown = countdown; auto out = exceptions_internal::TestAtCountdown(factory, op, countdown,
try { checkers...);
op(t); if (!out.has_value()) {
break;
} catch (const exceptions_internal::TestException& e) {
out = exceptions_internal::TestInvariants(*t, e, countdown, checkers...);
if (!out) return out;
}
}
UnsetCountdown(); UnsetCountdown();
return out; return testing::AssertionSuccess();
}
if (!*out) return *out;
}
} }
// Returns a functor to test for the strong exception-safety guarantee. If T is // Returns a functor to test for the strong exception-safety guarantee.
// copyable, use the const T& overload, otherwise pass a unique_ptr<T>. // Equality comparisons are made against the T provided by the factory and
// Equality comparisons are made against the T provided and default to using // default to using operator==.
// operator==. See the documentation for TestExceptionSafety if T doesn't have
// operator== but the strong guarantee still makes sense for it.
// //
// Parameters: // Parameters:
// * T: The type under test. // * TFactory: operator() returns a unique_ptr to the type under test. It
template <typename T, typename EqualTo = std::equal_to<T>> // should always return pointers to values which compare equal.
exceptions_internal::StrongGuaranteeTester<T, EqualTo> StrongGuarantee( template <typename TFactory, typename EqualTo = std::equal_to<
const T& t, EqualTo eq = EqualTo()) { exceptions_internal::FactoryType<TFactory>>>
return exceptions_internal::StrongGuaranteeTester<T, EqualTo>( exceptions_internal::StrongGuaranteeTester<
absl::make_unique<T>(t), eq); exceptions_internal::FactoryType<TFactory>, EqualTo>
} StrongGuarantee(TFactory factory, EqualTo eq = EqualTo()) {
return exceptions_internal::StrongGuaranteeTester<
template <typename T, typename EqualTo = std::equal_to<T>> exceptions_internal::FactoryType<TFactory>, EqualTo>(factory(), eq);
exceptions_internal::StrongGuaranteeTester<T, EqualTo> PointeeStrongGuarantee(
std::unique_ptr<T> t_ptr, EqualTo eq = EqualTo()) {
return exceptions_internal::StrongGuaranteeTester<T, EqualTo>(
std::move(t_ptr), eq);
} }
} // namespace absl } // namespace absl

View file

@ -28,6 +28,7 @@ cc_test(
size = "small", size = "small",
srcs = [ srcs = [
"int128_test.cc", "int128_test.cc",
"int128_test_unsigned_ostream_cases.inc",
], ],
copts = ABSL_TEST_COPTS, copts = ABSL_TEST_COPTS,
deps = [ deps = [

View file

@ -192,9 +192,8 @@ std::ostream& operator<<(std::ostream& o, const uint128& b) {
rep.append(width - rep.size(), o.fill()); rep.append(width - rep.size(), o.fill());
} else if (adjustfield == std::ios::internal && } else if (adjustfield == std::ios::internal &&
(flags & std::ios::showbase) && (flags & std::ios::showbase) &&
(flags & std::ios::basefield) != std::ios::dec) { (flags & std::ios::basefield) == std::ios::hex && b != 0) {
size_t base_size = (flags & std::ios::basefield) == std::ios::hex ? 2 : 1; rep.insert(2, width - rep.size(), o.fill());
rep.insert(base_size, width - rep.size(), o.fill());
} else { } else {
rep.insert(0, width - rep.size(), o.fill()); rep.insert(0, width - rep.size(), o.fill());
} }

View file

@ -428,79 +428,18 @@ TEST(Uint128, ConstexprTest) {
} }
TEST(Uint128, OStream) { TEST(Uint128, OStream) {
struct { struct StreamCase {
absl::uint128 val; absl::uint128 val;
std::ios_base::fmtflags flags; std::ios_base::fmtflags flags;
std::streamsize width; std::streamsize width;
char fill; char fill;
const char* rep; const char* rep;
} cases[] = {
// zero with different bases
{absl::uint128(0), std::ios::dec, 0, '_', "0"},
{absl::uint128(0), std::ios::oct, 0, '_', "0"},
{absl::uint128(0), std::ios::hex, 0, '_', "0"},
// crossover between lo_ and hi_
{absl::MakeUint128(0, -1), std::ios::dec, 0, '_', "18446744073709551615"},
{absl::MakeUint128(0, -1), std::ios::oct, 0, '_',
"1777777777777777777777"},
{absl::MakeUint128(0, -1), std::ios::hex, 0, '_', "ffffffffffffffff"},
{absl::MakeUint128(1, 0), std::ios::dec, 0, '_', "18446744073709551616"},
{absl::MakeUint128(1, 0), std::ios::oct, 0, '_',
"2000000000000000000000"},
{absl::MakeUint128(1, 0), std::ios::hex, 0, '_', "10000000000000000"},
// just the top bit
{absl::MakeUint128(0x8000000000000000, 0), std::ios::dec, 0, '_',
"170141183460469231731687303715884105728"},
{absl::MakeUint128(0x8000000000000000, 0), std::ios::oct, 0, '_',
"2000000000000000000000000000000000000000000"},
{absl::MakeUint128(0x8000000000000000, 0), std::ios::hex, 0, '_',
"80000000000000000000000000000000"},
// maximum absl::uint128 value
{absl::MakeUint128(-1, -1), std::ios::dec, 0, '_',
"340282366920938463463374607431768211455"},
{absl::MakeUint128(-1, -1), std::ios::oct, 0, '_',
"3777777777777777777777777777777777777777777"},
{absl::MakeUint128(-1, -1), std::ios::hex, 0, '_',
"ffffffffffffffffffffffffffffffff"},
// uppercase
{absl::MakeUint128(-1, -1), std::ios::hex | std::ios::uppercase, 0, '_',
"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"},
// showbase
{absl::uint128(1), std::ios::dec | std::ios::showbase, 0, '_', "1"},
{absl::uint128(1), std::ios::oct | std::ios::showbase, 0, '_', "01"},
{absl::uint128(1), std::ios::hex | std::ios::showbase, 0, '_', "0x1"},
// showbase does nothing on zero
{absl::uint128(0), std::ios::dec | std::ios::showbase, 0, '_', "0"},
{absl::uint128(0), std::ios::oct | std::ios::showbase, 0, '_', "0"},
{absl::uint128(0), std::ios::hex | std::ios::showbase, 0, '_', "0"},
// showpos does nothing on unsigned types
{absl::uint128(1), std::ios::dec | std::ios::showpos, 0, '_', "1"},
// right adjustment
{absl::uint128(9), std::ios::dec, 6, '_', "_____9"},
{absl::uint128(12345), std::ios::dec, 6, '_', "_12345"},
{absl::uint128(31), std::ios::hex | std::ios::showbase, 6, '_', "__0x1f"},
{absl::uint128(7), std::ios::oct | std::ios::showbase, 6, '_', "____07"},
// left adjustment
{absl::uint128(9), std::ios::dec | std::ios::left, 6, '_', "9_____"},
{absl::uint128(12345), std::ios::dec | std::ios::left, 6, '_', "12345_"},
{absl::uint128(31), std::ios::hex | std::ios::left | std::ios::showbase,
6, '_', "0x1f__"},
{absl::uint128(7), std::ios::oct | std::ios::left | std::ios::showbase, 6,
'_', "07____"},
// internal adjustment
{absl::uint128(123),
std::ios::dec | std::ios::internal | std::ios::showbase, 6, '_',
"___123"},
{absl::uint128(31),
std::ios::hex | std::ios::internal | std::ios::showbase, 6, '_',
"0x__1f"},
{absl::uint128(7),
std::ios::oct | std::ios::internal | std::ios::showbase, 6, '_',
"0____7"},
{absl::uint128(34), std::ios::hex | std::ios::internal, 6, '_', "____22"},
{absl::uint128(9), std::ios::oct | std::ios::internal, 6, '_', "____11"},
}; };
for (const auto& test_case : cases) {
std::vector<StreamCase> cases = {
#include "absl/numeric/int128_test_unsigned_ostream_cases.inc"
};
for (const StreamCase& test_case : cases) {
std::ostringstream os; std::ostringstream os;
os.flags(test_case.flags); os.flags(test_case.flags);
os.width(test_case.width); os.width(test_case.width);

View file

@ -0,0 +1,880 @@
// A small set of cases created manually for values greater than 2^64.
{absl::MakeUint128(1, 0), std::ios::dec, 0, '_', "18446744073709551616"},
{absl::MakeUint128(1, 0), std::ios::oct, 0, '_', "2000000000000000000000"},
{absl::MakeUint128(1, 0), std::ios::hex, 0, '_', "10000000000000000"},
{absl::MakeUint128(0x8000000000000000, 0), std::ios::dec, 0, '_', "170141183460469231731687303715884105728"},
{absl::MakeUint128(0x8000000000000000, 0), std::ios::oct, 0, '_', "2000000000000000000000000000000000000000000"},
{absl::MakeUint128(0x8000000000000000, 0), std::ios::hex, 0, '_', "80000000000000000000000000000000"},
{absl::MakeUint128(-1, -1), std::ios::dec, 0, '_', "340282366920938463463374607431768211455"},
{absl::MakeUint128(-1, -1), std::ios::oct, 0, '_', "3777777777777777777777777777777777777777777"},
{absl::MakeUint128(-1, -1), std::ios::hex, 0, '_', "ffffffffffffffffffffffffffffffff"},
// An exhaustive set of formatting cases generated with select values that fit
// into a uint64_t so they can be compared to what was output by the standard
// implementation.
{0, std::ios::dec | std::ios::left, 0, '_', "0"},
{0, std::ios::dec | std::ios::left, 10, '_', "0_________"},
{0, std::ios::dec | std::ios::left | std::ios::showpos, 0, '_', "0"},
{0, std::ios::dec | std::ios::left | std::ios::showpos, 10, '_', "0_________"},
{0, std::ios::dec | std::ios::left | std::ios::showbase, 0, '_', "0"},
{0, std::ios::dec | std::ios::left | std::ios::showbase, 10, '_', "0_________"},
{0, std::ios::dec | std::ios::left | std::ios::showbase | std::ios::showpos, 0, '_', "0"},
{0, std::ios::dec | std::ios::left | std::ios::showbase | std::ios::showpos, 10, '_', "0_________"},
{0, std::ios::dec | std::ios::left | std::ios::uppercase, 0, '_', "0"},
{0, std::ios::dec | std::ios::left | std::ios::uppercase, 10, '_', "0_________"},
{0, std::ios::dec | std::ios::left | std::ios::uppercase | std::ios::showpos, 0, '_', "0"},
{0, std::ios::dec | std::ios::left | std::ios::uppercase | std::ios::showpos, 10, '_', "0_________"},
{0, std::ios::dec | std::ios::left | std::ios::uppercase | std::ios::showbase, 0, '_', "0"},
{0, std::ios::dec | std::ios::left | std::ios::uppercase | std::ios::showbase, 10, '_', "0_________"},
{0, std::ios::dec | std::ios::left | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 0, '_', "0"},
{0, std::ios::dec | std::ios::left | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 10, '_', "0_________"},
{0, std::ios::dec | std::ios::internal, 0, '_', "0"},
{0, std::ios::dec | std::ios::internal, 10, '_', "_________0"},
{0, std::ios::dec | std::ios::internal | std::ios::showpos, 0, '_', "0"},
{0, std::ios::dec | std::ios::internal | std::ios::showpos, 10, '_', "_________0"},
{0, std::ios::dec | std::ios::internal | std::ios::showbase, 0, '_', "0"},
{0, std::ios::dec | std::ios::internal | std::ios::showbase, 10, '_', "_________0"},
{0, std::ios::dec | std::ios::internal | std::ios::showbase | std::ios::showpos, 0, '_', "0"},
{0, std::ios::dec | std::ios::internal | std::ios::showbase | std::ios::showpos, 10, '_', "_________0"},
{0, std::ios::dec | std::ios::internal | std::ios::uppercase, 0, '_', "0"},
{0, std::ios::dec | std::ios::internal | std::ios::uppercase, 10, '_', "_________0"},
{0, std::ios::dec | std::ios::internal | std::ios::uppercase | std::ios::showpos, 0, '_', "0"},
{0, std::ios::dec | std::ios::internal | std::ios::uppercase | std::ios::showpos, 10, '_', "_________0"},
{0, std::ios::dec | std::ios::internal | std::ios::uppercase | std::ios::showbase, 0, '_', "0"},
{0, std::ios::dec | std::ios::internal | std::ios::uppercase | std::ios::showbase, 10, '_', "_________0"},
{0, std::ios::dec | std::ios::internal | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 0, '_', "0"},
{0, std::ios::dec | std::ios::internal | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 10, '_', "_________0"},
{0, std::ios::dec | std::ios::right, 0, '_', "0"},
{0, std::ios::dec | std::ios::right, 10, '_', "_________0"},
{0, std::ios::dec | std::ios::right | std::ios::showpos, 0, '_', "0"},
{0, std::ios::dec | std::ios::right | std::ios::showpos, 10, '_', "_________0"},
{0, std::ios::dec | std::ios::right | std::ios::showbase, 0, '_', "0"},
{0, std::ios::dec | std::ios::right | std::ios::showbase, 10, '_', "_________0"},
{0, std::ios::dec | std::ios::right | std::ios::showbase | std::ios::showpos, 0, '_', "0"},
{0, std::ios::dec | std::ios::right | std::ios::showbase | std::ios::showpos, 10, '_', "_________0"},
{0, std::ios::dec | std::ios::right | std::ios::uppercase, 0, '_', "0"},
{0, std::ios::dec | std::ios::right | std::ios::uppercase, 10, '_', "_________0"},
{0, std::ios::dec | std::ios::right | std::ios::uppercase | std::ios::showpos, 0, '_', "0"},
{0, std::ios::dec | std::ios::right | std::ios::uppercase | std::ios::showpos, 10, '_', "_________0"},
{0, std::ios::dec | std::ios::right | std::ios::uppercase | std::ios::showbase, 0, '_', "0"},
{0, std::ios::dec | std::ios::right | std::ios::uppercase | std::ios::showbase, 10, '_', "_________0"},
{0, std::ios::dec | std::ios::right | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 0, '_', "0"},
{0, std::ios::dec | std::ios::right | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 10, '_', "_________0"},
{0, std::ios::oct | std::ios::left, 0, '_', "0"},
{0, std::ios::oct | std::ios::left, 10, '_', "0_________"},
{0, std::ios::oct | std::ios::left | std::ios::showpos, 0, '_', "0"},
{0, std::ios::oct | std::ios::left | std::ios::showpos, 10, '_', "0_________"},
{0, std::ios::oct | std::ios::left | std::ios::showbase, 0, '_', "0"},
{0, std::ios::oct | std::ios::left | std::ios::showbase, 10, '_', "0_________"},
{0, std::ios::oct | std::ios::left | std::ios::showbase | std::ios::showpos, 0, '_', "0"},
{0, std::ios::oct | std::ios::left | std::ios::showbase | std::ios::showpos, 10, '_', "0_________"},
{0, std::ios::oct | std::ios::left | std::ios::uppercase, 0, '_', "0"},
{0, std::ios::oct | std::ios::left | std::ios::uppercase, 10, '_', "0_________"},
{0, std::ios::oct | std::ios::left | std::ios::uppercase | std::ios::showpos, 0, '_', "0"},
{0, std::ios::oct | std::ios::left | std::ios::uppercase | std::ios::showpos, 10, '_', "0_________"},
{0, std::ios::oct | std::ios::left | std::ios::uppercase | std::ios::showbase, 0, '_', "0"},
{0, std::ios::oct | std::ios::left | std::ios::uppercase | std::ios::showbase, 10, '_', "0_________"},
{0, std::ios::oct | std::ios::left | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 0, '_', "0"},
{0, std::ios::oct | std::ios::left | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 10, '_', "0_________"},
{0, std::ios::oct | std::ios::internal, 0, '_', "0"},
{0, std::ios::oct | std::ios::internal, 10, '_', "_________0"},
{0, std::ios::oct | std::ios::internal | std::ios::showpos, 0, '_', "0"},
{0, std::ios::oct | std::ios::internal | std::ios::showpos, 10, '_', "_________0"},
{0, std::ios::oct | std::ios::internal | std::ios::showbase, 0, '_', "0"},
{0, std::ios::oct | std::ios::internal | std::ios::showbase, 10, '_', "_________0"},
{0, std::ios::oct | std::ios::internal | std::ios::showbase | std::ios::showpos, 0, '_', "0"},
{0, std::ios::oct | std::ios::internal | std::ios::showbase | std::ios::showpos, 10, '_', "_________0"},
{0, std::ios::oct | std::ios::internal | std::ios::uppercase, 0, '_', "0"},
{0, std::ios::oct | std::ios::internal | std::ios::uppercase, 10, '_', "_________0"},
{0, std::ios::oct | std::ios::internal | std::ios::uppercase | std::ios::showpos, 0, '_', "0"},
{0, std::ios::oct | std::ios::internal | std::ios::uppercase | std::ios::showpos, 10, '_', "_________0"},
{0, std::ios::oct | std::ios::internal | std::ios::uppercase | std::ios::showbase, 0, '_', "0"},
{0, std::ios::oct | std::ios::internal | std::ios::uppercase | std::ios::showbase, 10, '_', "_________0"},
{0, std::ios::oct | std::ios::internal | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 0, '_', "0"},
{0, std::ios::oct | std::ios::internal | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 10, '_', "_________0"},
{0, std::ios::oct | std::ios::right, 0, '_', "0"},
{0, std::ios::oct | std::ios::right, 10, '_', "_________0"},
{0, std::ios::oct | std::ios::right | std::ios::showpos, 0, '_', "0"},
{0, std::ios::oct | std::ios::right | std::ios::showpos, 10, '_', "_________0"},
{0, std::ios::oct | std::ios::right | std::ios::showbase, 0, '_', "0"},
{0, std::ios::oct | std::ios::right | std::ios::showbase, 10, '_', "_________0"},
{0, std::ios::oct | std::ios::right | std::ios::showbase | std::ios::showpos, 0, '_', "0"},
{0, std::ios::oct | std::ios::right | std::ios::showbase | std::ios::showpos, 10, '_', "_________0"},
{0, std::ios::oct | std::ios::right | std::ios::uppercase, 0, '_', "0"},
{0, std::ios::oct | std::ios::right | std::ios::uppercase, 10, '_', "_________0"},
{0, std::ios::oct | std::ios::right | std::ios::uppercase | std::ios::showpos, 0, '_', "0"},
{0, std::ios::oct | std::ios::right | std::ios::uppercase | std::ios::showpos, 10, '_', "_________0"},
{0, std::ios::oct | std::ios::right | std::ios::uppercase | std::ios::showbase, 0, '_', "0"},
{0, std::ios::oct | std::ios::right | std::ios::uppercase | std::ios::showbase, 10, '_', "_________0"},
{0, std::ios::oct | std::ios::right | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 0, '_', "0"},
{0, std::ios::oct | std::ios::right | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 10, '_', "_________0"},
{0, std::ios::hex | std::ios::left, 0, '_', "0"},
{0, std::ios::hex | std::ios::left, 10, '_', "0_________"},
{0, std::ios::hex | std::ios::left | std::ios::showpos, 0, '_', "0"},
{0, std::ios::hex | std::ios::left | std::ios::showpos, 10, '_', "0_________"},
{0, std::ios::hex | std::ios::left | std::ios::showbase, 0, '_', "0"},
{0, std::ios::hex | std::ios::left | std::ios::showbase, 10, '_', "0_________"},
{0, std::ios::hex | std::ios::left | std::ios::showbase | std::ios::showpos, 0, '_', "0"},
{0, std::ios::hex | std::ios::left | std::ios::showbase | std::ios::showpos, 10, '_', "0_________"},
{0, std::ios::hex | std::ios::left | std::ios::uppercase, 0, '_', "0"},
{0, std::ios::hex | std::ios::left | std::ios::uppercase, 10, '_', "0_________"},
{0, std::ios::hex | std::ios::left | std::ios::uppercase | std::ios::showpos, 0, '_', "0"},
{0, std::ios::hex | std::ios::left | std::ios::uppercase | std::ios::showpos, 10, '_', "0_________"},
{0, std::ios::hex | std::ios::left | std::ios::uppercase | std::ios::showbase, 0, '_', "0"},
{0, std::ios::hex | std::ios::left | std::ios::uppercase | std::ios::showbase, 10, '_', "0_________"},
{0, std::ios::hex | std::ios::left | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 0, '_', "0"},
{0, std::ios::hex | std::ios::left | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 10, '_', "0_________"},
{0, std::ios::hex | std::ios::internal, 0, '_', "0"},
{0, std::ios::hex | std::ios::internal, 10, '_', "_________0"},
{0, std::ios::hex | std::ios::internal | std::ios::showpos, 0, '_', "0"},
{0, std::ios::hex | std::ios::internal | std::ios::showpos, 10, '_', "_________0"},
{0, std::ios::hex | std::ios::internal | std::ios::showbase, 0, '_', "0"},
{0, std::ios::hex | std::ios::internal | std::ios::showbase, 10, '_', "_________0"},
{0, std::ios::hex | std::ios::internal | std::ios::showbase | std::ios::showpos, 0, '_', "0"},
{0, std::ios::hex | std::ios::internal | std::ios::showbase | std::ios::showpos, 10, '_', "_________0"},
{0, std::ios::hex | std::ios::internal | std::ios::uppercase, 0, '_', "0"},
{0, std::ios::hex | std::ios::internal | std::ios::uppercase, 10, '_', "_________0"},
{0, std::ios::hex | std::ios::internal | std::ios::uppercase | std::ios::showpos, 0, '_', "0"},
{0, std::ios::hex | std::ios::internal | std::ios::uppercase | std::ios::showpos, 10, '_', "_________0"},
{0, std::ios::hex | std::ios::internal | std::ios::uppercase | std::ios::showbase, 0, '_', "0"},
{0, std::ios::hex | std::ios::internal | std::ios::uppercase | std::ios::showbase, 10, '_', "_________0"},
{0, std::ios::hex | std::ios::internal | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 0, '_', "0"},
{0, std::ios::hex | std::ios::internal | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 10, '_', "_________0"},
{0, std::ios::hex | std::ios::right, 0, '_', "0"},
{0, std::ios::hex | std::ios::right, 10, '_', "_________0"},
{0, std::ios::hex | std::ios::right | std::ios::showpos, 0, '_', "0"},
{0, std::ios::hex | std::ios::right | std::ios::showpos, 10, '_', "_________0"},
{0, std::ios::hex | std::ios::right | std::ios::showbase, 0, '_', "0"},
{0, std::ios::hex | std::ios::right | std::ios::showbase, 10, '_', "_________0"},
{0, std::ios::hex | std::ios::right | std::ios::showbase | std::ios::showpos, 0, '_', "0"},
{0, std::ios::hex | std::ios::right | std::ios::showbase | std::ios::showpos, 10, '_', "_________0"},
{0, std::ios::hex | std::ios::right | std::ios::uppercase, 0, '_', "0"},
{0, std::ios::hex | std::ios::right | std::ios::uppercase, 10, '_', "_________0"},
{0, std::ios::hex | std::ios::right | std::ios::uppercase | std::ios::showpos, 0, '_', "0"},
{0, std::ios::hex | std::ios::right | std::ios::uppercase | std::ios::showpos, 10, '_', "_________0"},
{0, std::ios::hex | std::ios::right | std::ios::uppercase | std::ios::showbase, 0, '_', "0"},
{0, std::ios::hex | std::ios::right | std::ios::uppercase | std::ios::showbase, 10, '_', "_________0"},
{0, std::ios::hex | std::ios::right | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 0, '_', "0"},
{0, std::ios::hex | std::ios::right | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 10, '_', "_________0"},
{8, std::ios::dec | std::ios::left, 0, '_', "8"},
{8, std::ios::dec | std::ios::left, 10, '_', "8_________"},
{8, std::ios::dec | std::ios::left | std::ios::showpos, 0, '_', "8"},
{8, std::ios::dec | std::ios::left | std::ios::showpos, 10, '_', "8_________"},
{8, std::ios::dec | std::ios::left | std::ios::showbase, 0, '_', "8"},
{8, std::ios::dec | std::ios::left | std::ios::showbase, 10, '_', "8_________"},
{8, std::ios::dec | std::ios::left | std::ios::showbase | std::ios::showpos, 0, '_', "8"},
{8, std::ios::dec | std::ios::left | std::ios::showbase | std::ios::showpos, 10, '_', "8_________"},
{8, std::ios::dec | std::ios::left | std::ios::uppercase, 0, '_', "8"},
{8, std::ios::dec | std::ios::left | std::ios::uppercase, 10, '_', "8_________"},
{8, std::ios::dec | std::ios::left | std::ios::uppercase | std::ios::showpos, 0, '_', "8"},
{8, std::ios::dec | std::ios::left | std::ios::uppercase | std::ios::showpos, 10, '_', "8_________"},
{8, std::ios::dec | std::ios::left | std::ios::uppercase | std::ios::showbase, 0, '_', "8"},
{8, std::ios::dec | std::ios::left | std::ios::uppercase | std::ios::showbase, 10, '_', "8_________"},
{8, std::ios::dec | std::ios::left | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 0, '_', "8"},
{8, std::ios::dec | std::ios::left | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 10, '_', "8_________"},
{8, std::ios::dec | std::ios::internal, 0, '_', "8"},
{8, std::ios::dec | std::ios::internal, 10, '_', "_________8"},
{8, std::ios::dec | std::ios::internal | std::ios::showpos, 0, '_', "8"},
{8, std::ios::dec | std::ios::internal | std::ios::showpos, 10, '_', "_________8"},
{8, std::ios::dec | std::ios::internal | std::ios::showbase, 0, '_', "8"},
{8, std::ios::dec | std::ios::internal | std::ios::showbase, 10, '_', "_________8"},
{8, std::ios::dec | std::ios::internal | std::ios::showbase | std::ios::showpos, 0, '_', "8"},
{8, std::ios::dec | std::ios::internal | std::ios::showbase | std::ios::showpos, 10, '_', "_________8"},
{8, std::ios::dec | std::ios::internal | std::ios::uppercase, 0, '_', "8"},
{8, std::ios::dec | std::ios::internal | std::ios::uppercase, 10, '_', "_________8"},
{8, std::ios::dec | std::ios::internal | std::ios::uppercase | std::ios::showpos, 0, '_', "8"},
{8, std::ios::dec | std::ios::internal | std::ios::uppercase | std::ios::showpos, 10, '_', "_________8"},
{8, std::ios::dec | std::ios::internal | std::ios::uppercase | std::ios::showbase, 0, '_', "8"},
{8, std::ios::dec | std::ios::internal | std::ios::uppercase | std::ios::showbase, 10, '_', "_________8"},
{8, std::ios::dec | std::ios::internal | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 0, '_', "8"},
{8, std::ios::dec | std::ios::internal | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 10, '_', "_________8"},
{8, std::ios::dec | std::ios::right, 0, '_', "8"},
{8, std::ios::dec | std::ios::right, 10, '_', "_________8"},
{8, std::ios::dec | std::ios::right | std::ios::showpos, 0, '_', "8"},
{8, std::ios::dec | std::ios::right | std::ios::showpos, 10, '_', "_________8"},
{8, std::ios::dec | std::ios::right | std::ios::showbase, 0, '_', "8"},
{8, std::ios::dec | std::ios::right | std::ios::showbase, 10, '_', "_________8"},
{8, std::ios::dec | std::ios::right | std::ios::showbase | std::ios::showpos, 0, '_', "8"},
{8, std::ios::dec | std::ios::right | std::ios::showbase | std::ios::showpos, 10, '_', "_________8"},
{8, std::ios::dec | std::ios::right | std::ios::uppercase, 0, '_', "8"},
{8, std::ios::dec | std::ios::right | std::ios::uppercase, 10, '_', "_________8"},
{8, std::ios::dec | std::ios::right | std::ios::uppercase | std::ios::showpos, 0, '_', "8"},
{8, std::ios::dec | std::ios::right | std::ios::uppercase | std::ios::showpos, 10, '_', "_________8"},
{8, std::ios::dec | std::ios::right | std::ios::uppercase | std::ios::showbase, 0, '_', "8"},
{8, std::ios::dec | std::ios::right | std::ios::uppercase | std::ios::showbase, 10, '_', "_________8"},
{8, std::ios::dec | std::ios::right | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 0, '_', "8"},
{8, std::ios::dec | std::ios::right | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 10, '_', "_________8"},
{8, std::ios::oct | std::ios::left, 0, '_', "10"},
{8, std::ios::oct | std::ios::left, 10, '_', "10________"},
{8, std::ios::oct | std::ios::left | std::ios::showpos, 0, '_', "10"},
{8, std::ios::oct | std::ios::left | std::ios::showpos, 10, '_', "10________"},
{8, std::ios::oct | std::ios::left | std::ios::showbase, 0, '_', "010"},
{8, std::ios::oct | std::ios::left | std::ios::showbase, 10, '_', "010_______"},
{8, std::ios::oct | std::ios::left | std::ios::showbase | std::ios::showpos, 0, '_', "010"},
{8, std::ios::oct | std::ios::left | std::ios::showbase | std::ios::showpos, 10, '_', "010_______"},
{8, std::ios::oct | std::ios::left | std::ios::uppercase, 0, '_', "10"},
{8, std::ios::oct | std::ios::left | std::ios::uppercase, 10, '_', "10________"},
{8, std::ios::oct | std::ios::left | std::ios::uppercase | std::ios::showpos, 0, '_', "10"},
{8, std::ios::oct | std::ios::left | std::ios::uppercase | std::ios::showpos, 10, '_', "10________"},
{8, std::ios::oct | std::ios::left | std::ios::uppercase | std::ios::showbase, 0, '_', "010"},
{8, std::ios::oct | std::ios::left | std::ios::uppercase | std::ios::showbase, 10, '_', "010_______"},
{8, std::ios::oct | std::ios::left | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 0, '_', "010"},
{8, std::ios::oct | std::ios::left | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 10, '_', "010_______"},
{8, std::ios::oct | std::ios::internal, 0, '_', "10"},
{8, std::ios::oct | std::ios::internal, 10, '_', "________10"},
{8, std::ios::oct | std::ios::internal | std::ios::showpos, 0, '_', "10"},
{8, std::ios::oct | std::ios::internal | std::ios::showpos, 10, '_', "________10"},
{8, std::ios::oct | std::ios::internal | std::ios::showbase, 0, '_', "010"},
{8, std::ios::oct | std::ios::internal | std::ios::showbase, 10, '_', "_______010"},
{8, std::ios::oct | std::ios::internal | std::ios::showbase | std::ios::showpos, 0, '_', "010"},
{8, std::ios::oct | std::ios::internal | std::ios::showbase | std::ios::showpos, 10, '_', "_______010"},
{8, std::ios::oct | std::ios::internal | std::ios::uppercase, 0, '_', "10"},
{8, std::ios::oct | std::ios::internal | std::ios::uppercase, 10, '_', "________10"},
{8, std::ios::oct | std::ios::internal | std::ios::uppercase | std::ios::showpos, 0, '_', "10"},
{8, std::ios::oct | std::ios::internal | std::ios::uppercase | std::ios::showpos, 10, '_', "________10"},
{8, std::ios::oct | std::ios::internal | std::ios::uppercase | std::ios::showbase, 0, '_', "010"},
{8, std::ios::oct | std::ios::internal | std::ios::uppercase | std::ios::showbase, 10, '_', "_______010"},
{8, std::ios::oct | std::ios::internal | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 0, '_', "010"},
{8, std::ios::oct | std::ios::internal | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 10, '_', "_______010"},
{8, std::ios::oct | std::ios::right, 0, '_', "10"},
{8, std::ios::oct | std::ios::right, 10, '_', "________10"},
{8, std::ios::oct | std::ios::right | std::ios::showpos, 0, '_', "10"},
{8, std::ios::oct | std::ios::right | std::ios::showpos, 10, '_', "________10"},
{8, std::ios::oct | std::ios::right | std::ios::showbase, 0, '_', "010"},
{8, std::ios::oct | std::ios::right | std::ios::showbase, 10, '_', "_______010"},
{8, std::ios::oct | std::ios::right | std::ios::showbase | std::ios::showpos, 0, '_', "010"},
{8, std::ios::oct | std::ios::right | std::ios::showbase | std::ios::showpos, 10, '_', "_______010"},
{8, std::ios::oct | std::ios::right | std::ios::uppercase, 0, '_', "10"},
{8, std::ios::oct | std::ios::right | std::ios::uppercase, 10, '_', "________10"},
{8, std::ios::oct | std::ios::right | std::ios::uppercase | std::ios::showpos, 0, '_', "10"},
{8, std::ios::oct | std::ios::right | std::ios::uppercase | std::ios::showpos, 10, '_', "________10"},
{8, std::ios::oct | std::ios::right | std::ios::uppercase | std::ios::showbase, 0, '_', "010"},
{8, std::ios::oct | std::ios::right | std::ios::uppercase | std::ios::showbase, 10, '_', "_______010"},
{8, std::ios::oct | std::ios::right | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 0, '_', "010"},
{8, std::ios::oct | std::ios::right | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 10, '_', "_______010"},
{8, std::ios::hex | std::ios::left, 0, '_', "8"},
{8, std::ios::hex | std::ios::left, 10, '_', "8_________"},
{8, std::ios::hex | std::ios::left | std::ios::showpos, 0, '_', "8"},
{8, std::ios::hex | std::ios::left | std::ios::showpos, 10, '_', "8_________"},
{8, std::ios::hex | std::ios::left | std::ios::showbase, 0, '_', "0x8"},
{8, std::ios::hex | std::ios::left | std::ios::showbase, 10, '_', "0x8_______"},
{8, std::ios::hex | std::ios::left | std::ios::showbase | std::ios::showpos, 0, '_', "0x8"},
{8, std::ios::hex | std::ios::left | std::ios::showbase | std::ios::showpos, 10, '_', "0x8_______"},
{8, std::ios::hex | std::ios::left | std::ios::uppercase, 0, '_', "8"},
{8, std::ios::hex | std::ios::left | std::ios::uppercase, 10, '_', "8_________"},
{8, std::ios::hex | std::ios::left | std::ios::uppercase | std::ios::showpos, 0, '_', "8"},
{8, std::ios::hex | std::ios::left | std::ios::uppercase | std::ios::showpos, 10, '_', "8_________"},
{8, std::ios::hex | std::ios::left | std::ios::uppercase | std::ios::showbase, 0, '_', "0X8"},
{8, std::ios::hex | std::ios::left | std::ios::uppercase | std::ios::showbase, 10, '_', "0X8_______"},
{8, std::ios::hex | std::ios::left | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 0, '_', "0X8"},
{8, std::ios::hex | std::ios::left | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 10, '_', "0X8_______"},
{8, std::ios::hex | std::ios::internal, 0, '_', "8"},
{8, std::ios::hex | std::ios::internal, 10, '_', "_________8"},
{8, std::ios::hex | std::ios::internal | std::ios::showpos, 0, '_', "8"},
{8, std::ios::hex | std::ios::internal | std::ios::showpos, 10, '_', "_________8"},
{8, std::ios::hex | std::ios::internal | std::ios::showbase, 0, '_', "0x8"},
{8, std::ios::hex | std::ios::internal | std::ios::showbase, 10, '_', "0x_______8"},
{8, std::ios::hex | std::ios::internal | std::ios::showbase | std::ios::showpos, 0, '_', "0x8"},
{8, std::ios::hex | std::ios::internal | std::ios::showbase | std::ios::showpos, 10, '_', "0x_______8"},
{8, std::ios::hex | std::ios::internal | std::ios::uppercase, 0, '_', "8"},
{8, std::ios::hex | std::ios::internal | std::ios::uppercase, 10, '_', "_________8"},
{8, std::ios::hex | std::ios::internal | std::ios::uppercase | std::ios::showpos, 0, '_', "8"},
{8, std::ios::hex | std::ios::internal | std::ios::uppercase | std::ios::showpos, 10, '_', "_________8"},
{8, std::ios::hex | std::ios::internal | std::ios::uppercase | std::ios::showbase, 0, '_', "0X8"},
{8, std::ios::hex | std::ios::internal | std::ios::uppercase | std::ios::showbase, 10, '_', "0X_______8"},
{8, std::ios::hex | std::ios::internal | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 0, '_', "0X8"},
{8, std::ios::hex | std::ios::internal | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 10, '_', "0X_______8"},
{8, std::ios::hex | std::ios::right, 0, '_', "8"},
{8, std::ios::hex | std::ios::right, 10, '_', "_________8"},
{8, std::ios::hex | std::ios::right | std::ios::showpos, 0, '_', "8"},
{8, std::ios::hex | std::ios::right | std::ios::showpos, 10, '_', "_________8"},
{8, std::ios::hex | std::ios::right | std::ios::showbase, 0, '_', "0x8"},
{8, std::ios::hex | std::ios::right | std::ios::showbase, 10, '_', "_______0x8"},
{8, std::ios::hex | std::ios::right | std::ios::showbase | std::ios::showpos, 0, '_', "0x8"},
{8, std::ios::hex | std::ios::right | std::ios::showbase | std::ios::showpos, 10, '_', "_______0x8"},
{8, std::ios::hex | std::ios::right | std::ios::uppercase, 0, '_', "8"},
{8, std::ios::hex | std::ios::right | std::ios::uppercase, 10, '_', "_________8"},
{8, std::ios::hex | std::ios::right | std::ios::uppercase | std::ios::showpos, 0, '_', "8"},
{8, std::ios::hex | std::ios::right | std::ios::uppercase | std::ios::showpos, 10, '_', "_________8"},
{8, std::ios::hex | std::ios::right | std::ios::uppercase | std::ios::showbase, 0, '_', "0X8"},
{8, std::ios::hex | std::ios::right | std::ios::uppercase | std::ios::showbase, 10, '_', "_______0X8"},
{8, std::ios::hex | std::ios::right | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 0, '_', "0X8"},
{8, std::ios::hex | std::ios::right | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 10, '_', "_______0X8"},
{31, std::ios::dec | std::ios::left, 0, '_', "31"},
{31, std::ios::dec | std::ios::left, 10, '_', "31________"},
{31, std::ios::dec | std::ios::left | std::ios::showpos, 0, '_', "31"},
{31, std::ios::dec | std::ios::left | std::ios::showpos, 10, '_', "31________"},
{31, std::ios::dec | std::ios::left | std::ios::showbase, 0, '_', "31"},
{31, std::ios::dec | std::ios::left | std::ios::showbase, 10, '_', "31________"},
{31, std::ios::dec | std::ios::left | std::ios::showbase | std::ios::showpos, 0, '_', "31"},
{31, std::ios::dec | std::ios::left | std::ios::showbase | std::ios::showpos, 10, '_', "31________"},
{31, std::ios::dec | std::ios::left | std::ios::uppercase, 0, '_', "31"},
{31, std::ios::dec | std::ios::left | std::ios::uppercase, 10, '_', "31________"},
{31, std::ios::dec | std::ios::left | std::ios::uppercase | std::ios::showpos, 0, '_', "31"},
{31, std::ios::dec | std::ios::left | std::ios::uppercase | std::ios::showpos, 10, '_', "31________"},
{31, std::ios::dec | std::ios::left | std::ios::uppercase | std::ios::showbase, 0, '_', "31"},
{31, std::ios::dec | std::ios::left | std::ios::uppercase | std::ios::showbase, 10, '_', "31________"},
{31, std::ios::dec | std::ios::left | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 0, '_', "31"},
{31, std::ios::dec | std::ios::left | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 10, '_', "31________"},
{31, std::ios::dec | std::ios::internal, 0, '_', "31"},
{31, std::ios::dec | std::ios::internal, 10, '_', "________31"},
{31, std::ios::dec | std::ios::internal | std::ios::showpos, 0, '_', "31"},
{31, std::ios::dec | std::ios::internal | std::ios::showpos, 10, '_', "________31"},
{31, std::ios::dec | std::ios::internal | std::ios::showbase, 0, '_', "31"},
{31, std::ios::dec | std::ios::internal | std::ios::showbase, 10, '_', "________31"},
{31, std::ios::dec | std::ios::internal | std::ios::showbase | std::ios::showpos, 0, '_', "31"},
{31, std::ios::dec | std::ios::internal | std::ios::showbase | std::ios::showpos, 10, '_', "________31"},
{31, std::ios::dec | std::ios::internal | std::ios::uppercase, 0, '_', "31"},
{31, std::ios::dec | std::ios::internal | std::ios::uppercase, 10, '_', "________31"},
{31, std::ios::dec | std::ios::internal | std::ios::uppercase | std::ios::showpos, 0, '_', "31"},
{31, std::ios::dec | std::ios::internal | std::ios::uppercase | std::ios::showpos, 10, '_', "________31"},
{31, std::ios::dec | std::ios::internal | std::ios::uppercase | std::ios::showbase, 0, '_', "31"},
{31, std::ios::dec | std::ios::internal | std::ios::uppercase | std::ios::showbase, 10, '_', "________31"},
{31, std::ios::dec | std::ios::internal | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 0, '_', "31"},
{31, std::ios::dec | std::ios::internal | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 10, '_', "________31"},
{31, std::ios::dec | std::ios::right, 0, '_', "31"},
{31, std::ios::dec | std::ios::right, 10, '_', "________31"},
{31, std::ios::dec | std::ios::right | std::ios::showpos, 0, '_', "31"},
{31, std::ios::dec | std::ios::right | std::ios::showpos, 10, '_', "________31"},
{31, std::ios::dec | std::ios::right | std::ios::showbase, 0, '_', "31"},
{31, std::ios::dec | std::ios::right | std::ios::showbase, 10, '_', "________31"},
{31, std::ios::dec | std::ios::right | std::ios::showbase | std::ios::showpos, 0, '_', "31"},
{31, std::ios::dec | std::ios::right | std::ios::showbase | std::ios::showpos, 10, '_', "________31"},
{31, std::ios::dec | std::ios::right | std::ios::uppercase, 0, '_', "31"},
{31, std::ios::dec | std::ios::right | std::ios::uppercase, 10, '_', "________31"},
{31, std::ios::dec | std::ios::right | std::ios::uppercase | std::ios::showpos, 0, '_', "31"},
{31, std::ios::dec | std::ios::right | std::ios::uppercase | std::ios::showpos, 10, '_', "________31"},
{31, std::ios::dec | std::ios::right | std::ios::uppercase | std::ios::showbase, 0, '_', "31"},
{31, std::ios::dec | std::ios::right | std::ios::uppercase | std::ios::showbase, 10, '_', "________31"},
{31, std::ios::dec | std::ios::right | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 0, '_', "31"},
{31, std::ios::dec | std::ios::right | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 10, '_', "________31"},
{31, std::ios::oct | std::ios::left, 0, '_', "37"},
{31, std::ios::oct | std::ios::left, 10, '_', "37________"},
{31, std::ios::oct | std::ios::left | std::ios::showpos, 0, '_', "37"},
{31, std::ios::oct | std::ios::left | std::ios::showpos, 10, '_', "37________"},
{31, std::ios::oct | std::ios::left | std::ios::showbase, 0, '_', "037"},
{31, std::ios::oct | std::ios::left | std::ios::showbase, 10, '_', "037_______"},
{31, std::ios::oct | std::ios::left | std::ios::showbase | std::ios::showpos, 0, '_', "037"},
{31, std::ios::oct | std::ios::left | std::ios::showbase | std::ios::showpos, 10, '_', "037_______"},
{31, std::ios::oct | std::ios::left | std::ios::uppercase, 0, '_', "37"},
{31, std::ios::oct | std::ios::left | std::ios::uppercase, 10, '_', "37________"},
{31, std::ios::oct | std::ios::left | std::ios::uppercase | std::ios::showpos, 0, '_', "37"},
{31, std::ios::oct | std::ios::left | std::ios::uppercase | std::ios::showpos, 10, '_', "37________"},
{31, std::ios::oct | std::ios::left | std::ios::uppercase | std::ios::showbase, 0, '_', "037"},
{31, std::ios::oct | std::ios::left | std::ios::uppercase | std::ios::showbase, 10, '_', "037_______"},
{31, std::ios::oct | std::ios::left | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 0, '_', "037"},
{31, std::ios::oct | std::ios::left | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 10, '_', "037_______"},
{31, std::ios::oct | std::ios::internal, 0, '_', "37"},
{31, std::ios::oct | std::ios::internal, 10, '_', "________37"},
{31, std::ios::oct | std::ios::internal | std::ios::showpos, 0, '_', "37"},
{31, std::ios::oct | std::ios::internal | std::ios::showpos, 10, '_', "________37"},
{31, std::ios::oct | std::ios::internal | std::ios::showbase, 0, '_', "037"},
{31, std::ios::oct | std::ios::internal | std::ios::showbase, 10, '_', "_______037"},
{31, std::ios::oct | std::ios::internal | std::ios::showbase | std::ios::showpos, 0, '_', "037"},
{31, std::ios::oct | std::ios::internal | std::ios::showbase | std::ios::showpos, 10, '_', "_______037"},
{31, std::ios::oct | std::ios::internal | std::ios::uppercase, 0, '_', "37"},
{31, std::ios::oct | std::ios::internal | std::ios::uppercase, 10, '_', "________37"},
{31, std::ios::oct | std::ios::internal | std::ios::uppercase | std::ios::showpos, 0, '_', "37"},
{31, std::ios::oct | std::ios::internal | std::ios::uppercase | std::ios::showpos, 10, '_', "________37"},
{31, std::ios::oct | std::ios::internal | std::ios::uppercase | std::ios::showbase, 0, '_', "037"},
{31, std::ios::oct | std::ios::internal | std::ios::uppercase | std::ios::showbase, 10, '_', "_______037"},
{31, std::ios::oct | std::ios::internal | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 0, '_', "037"},
{31, std::ios::oct | std::ios::internal | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 10, '_', "_______037"},
{31, std::ios::oct | std::ios::right, 0, '_', "37"},
{31, std::ios::oct | std::ios::right, 10, '_', "________37"},
{31, std::ios::oct | std::ios::right | std::ios::showpos, 0, '_', "37"},
{31, std::ios::oct | std::ios::right | std::ios::showpos, 10, '_', "________37"},
{31, std::ios::oct | std::ios::right | std::ios::showbase, 0, '_', "037"},
{31, std::ios::oct | std::ios::right | std::ios::showbase, 10, '_', "_______037"},
{31, std::ios::oct | std::ios::right | std::ios::showbase | std::ios::showpos, 0, '_', "037"},
{31, std::ios::oct | std::ios::right | std::ios::showbase | std::ios::showpos, 10, '_', "_______037"},
{31, std::ios::oct | std::ios::right | std::ios::uppercase, 0, '_', "37"},
{31, std::ios::oct | std::ios::right | std::ios::uppercase, 10, '_', "________37"},
{31, std::ios::oct | std::ios::right | std::ios::uppercase | std::ios::showpos, 0, '_', "37"},
{31, std::ios::oct | std::ios::right | std::ios::uppercase | std::ios::showpos, 10, '_', "________37"},
{31, std::ios::oct | std::ios::right | std::ios::uppercase | std::ios::showbase, 0, '_', "037"},
{31, std::ios::oct | std::ios::right | std::ios::uppercase | std::ios::showbase, 10, '_', "_______037"},
{31, std::ios::oct | std::ios::right | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 0, '_', "037"},
{31, std::ios::oct | std::ios::right | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 10, '_', "_______037"},
{31, std::ios::hex | std::ios::left, 0, '_', "1f"},
{31, std::ios::hex | std::ios::left, 10, '_', "1f________"},
{31, std::ios::hex | std::ios::left | std::ios::showpos, 0, '_', "1f"},
{31, std::ios::hex | std::ios::left | std::ios::showpos, 10, '_', "1f________"},
{31, std::ios::hex | std::ios::left | std::ios::showbase, 0, '_', "0x1f"},
{31, std::ios::hex | std::ios::left | std::ios::showbase, 10, '_', "0x1f______"},
{31, std::ios::hex | std::ios::left | std::ios::showbase | std::ios::showpos, 0, '_', "0x1f"},
{31, std::ios::hex | std::ios::left | std::ios::showbase | std::ios::showpos, 10, '_', "0x1f______"},
{31, std::ios::hex | std::ios::left | std::ios::uppercase, 0, '_', "1F"},
{31, std::ios::hex | std::ios::left | std::ios::uppercase, 10, '_', "1F________"},
{31, std::ios::hex | std::ios::left | std::ios::uppercase | std::ios::showpos, 0, '_', "1F"},
{31, std::ios::hex | std::ios::left | std::ios::uppercase | std::ios::showpos, 10, '_', "1F________"},
{31, std::ios::hex | std::ios::left | std::ios::uppercase | std::ios::showbase, 0, '_', "0X1F"},
{31, std::ios::hex | std::ios::left | std::ios::uppercase | std::ios::showbase, 10, '_', "0X1F______"},
{31, std::ios::hex | std::ios::left | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 0, '_', "0X1F"},
{31, std::ios::hex | std::ios::left | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 10, '_', "0X1F______"},
{31, std::ios::hex | std::ios::internal, 0, '_', "1f"},
{31, std::ios::hex | std::ios::internal, 10, '_', "________1f"},
{31, std::ios::hex | std::ios::internal | std::ios::showpos, 0, '_', "1f"},
{31, std::ios::hex | std::ios::internal | std::ios::showpos, 10, '_', "________1f"},
{31, std::ios::hex | std::ios::internal | std::ios::showbase, 0, '_', "0x1f"},
{31, std::ios::hex | std::ios::internal | std::ios::showbase, 10, '_', "0x______1f"},
{31, std::ios::hex | std::ios::internal | std::ios::showbase | std::ios::showpos, 0, '_', "0x1f"},
{31, std::ios::hex | std::ios::internal | std::ios::showbase | std::ios::showpos, 10, '_', "0x______1f"},
{31, std::ios::hex | std::ios::internal | std::ios::uppercase, 0, '_', "1F"},
{31, std::ios::hex | std::ios::internal | std::ios::uppercase, 10, '_', "________1F"},
{31, std::ios::hex | std::ios::internal | std::ios::uppercase | std::ios::showpos, 0, '_', "1F"},
{31, std::ios::hex | std::ios::internal | std::ios::uppercase | std::ios::showpos, 10, '_', "________1F"},
{31, std::ios::hex | std::ios::internal | std::ios::uppercase | std::ios::showbase, 0, '_', "0X1F"},
{31, std::ios::hex | std::ios::internal | std::ios::uppercase | std::ios::showbase, 10, '_', "0X______1F"},
{31, std::ios::hex | std::ios::internal | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 0, '_', "0X1F"},
{31, std::ios::hex | std::ios::internal | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 10, '_', "0X______1F"},
{31, std::ios::hex | std::ios::right, 0, '_', "1f"},
{31, std::ios::hex | std::ios::right, 10, '_', "________1f"},
{31, std::ios::hex | std::ios::right | std::ios::showpos, 0, '_', "1f"},
{31, std::ios::hex | std::ios::right | std::ios::showpos, 10, '_', "________1f"},
{31, std::ios::hex | std::ios::right | std::ios::showbase, 0, '_', "0x1f"},
{31, std::ios::hex | std::ios::right | std::ios::showbase, 10, '_', "______0x1f"},
{31, std::ios::hex | std::ios::right | std::ios::showbase | std::ios::showpos, 0, '_', "0x1f"},
{31, std::ios::hex | std::ios::right | std::ios::showbase | std::ios::showpos, 10, '_', "______0x1f"},
{31, std::ios::hex | std::ios::right | std::ios::uppercase, 0, '_', "1F"},
{31, std::ios::hex | std::ios::right | std::ios::uppercase, 10, '_', "________1F"},
{31, std::ios::hex | std::ios::right | std::ios::uppercase | std::ios::showpos, 0, '_', "1F"},
{31, std::ios::hex | std::ios::right | std::ios::uppercase | std::ios::showpos, 10, '_', "________1F"},
{31, std::ios::hex | std::ios::right | std::ios::uppercase | std::ios::showbase, 0, '_', "0X1F"},
{31, std::ios::hex | std::ios::right | std::ios::uppercase | std::ios::showbase, 10, '_', "______0X1F"},
{31, std::ios::hex | std::ios::right | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 0, '_', "0X1F"},
{31, std::ios::hex | std::ios::right | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 10, '_', "______0X1F"},
{12345, std::ios::dec | std::ios::left, 0, '_', "12345"},
{12345, std::ios::dec | std::ios::left, 10, '_', "12345_____"},
{12345, std::ios::dec | std::ios::left | std::ios::showpos, 0, '_', "12345"},
{12345, std::ios::dec | std::ios::left | std::ios::showpos, 10, '_', "12345_____"},
{12345, std::ios::dec | std::ios::left | std::ios::showbase, 0, '_', "12345"},
{12345, std::ios::dec | std::ios::left | std::ios::showbase, 10, '_', "12345_____"},
{12345, std::ios::dec | std::ios::left | std::ios::showbase | std::ios::showpos, 0, '_', "12345"},
{12345, std::ios::dec | std::ios::left | std::ios::showbase | std::ios::showpos, 10, '_', "12345_____"},
{12345, std::ios::dec | std::ios::left | std::ios::uppercase, 0, '_', "12345"},
{12345, std::ios::dec | std::ios::left | std::ios::uppercase, 10, '_', "12345_____"},
{12345, std::ios::dec | std::ios::left | std::ios::uppercase | std::ios::showpos, 0, '_', "12345"},
{12345, std::ios::dec | std::ios::left | std::ios::uppercase | std::ios::showpos, 10, '_', "12345_____"},
{12345, std::ios::dec | std::ios::left | std::ios::uppercase | std::ios::showbase, 0, '_', "12345"},
{12345, std::ios::dec | std::ios::left | std::ios::uppercase | std::ios::showbase, 10, '_', "12345_____"},
{12345, std::ios::dec | std::ios::left | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 0, '_', "12345"},
{12345, std::ios::dec | std::ios::left | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 10, '_', "12345_____"},
{12345, std::ios::dec | std::ios::internal, 0, '_', "12345"},
{12345, std::ios::dec | std::ios::internal, 10, '_', "_____12345"},
{12345, std::ios::dec | std::ios::internal | std::ios::showpos, 0, '_', "12345"},
{12345, std::ios::dec | std::ios::internal | std::ios::showpos, 10, '_', "_____12345"},
{12345, std::ios::dec | std::ios::internal | std::ios::showbase, 0, '_', "12345"},
{12345, std::ios::dec | std::ios::internal | std::ios::showbase, 10, '_', "_____12345"},
{12345, std::ios::dec | std::ios::internal | std::ios::showbase | std::ios::showpos, 0, '_', "12345"},
{12345, std::ios::dec | std::ios::internal | std::ios::showbase | std::ios::showpos, 10, '_', "_____12345"},
{12345, std::ios::dec | std::ios::internal | std::ios::uppercase, 0, '_', "12345"},
{12345, std::ios::dec | std::ios::internal | std::ios::uppercase, 10, '_', "_____12345"},
{12345, std::ios::dec | std::ios::internal | std::ios::uppercase | std::ios::showpos, 0, '_', "12345"},
{12345, std::ios::dec | std::ios::internal | std::ios::uppercase | std::ios::showpos, 10, '_', "_____12345"},
{12345, std::ios::dec | std::ios::internal | std::ios::uppercase | std::ios::showbase, 0, '_', "12345"},
{12345, std::ios::dec | std::ios::internal | std::ios::uppercase | std::ios::showbase, 10, '_', "_____12345"},
{12345, std::ios::dec | std::ios::internal | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 0, '_', "12345"},
{12345, std::ios::dec | std::ios::internal | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 10, '_', "_____12345"},
{12345, std::ios::dec | std::ios::right, 0, '_', "12345"},
{12345, std::ios::dec | std::ios::right, 10, '_', "_____12345"},
{12345, std::ios::dec | std::ios::right | std::ios::showpos, 0, '_', "12345"},
{12345, std::ios::dec | std::ios::right | std::ios::showpos, 10, '_', "_____12345"},
{12345, std::ios::dec | std::ios::right | std::ios::showbase, 0, '_', "12345"},
{12345, std::ios::dec | std::ios::right | std::ios::showbase, 10, '_', "_____12345"},
{12345, std::ios::dec | std::ios::right | std::ios::showbase | std::ios::showpos, 0, '_', "12345"},
{12345, std::ios::dec | std::ios::right | std::ios::showbase | std::ios::showpos, 10, '_', "_____12345"},
{12345, std::ios::dec | std::ios::right | std::ios::uppercase, 0, '_', "12345"},
{12345, std::ios::dec | std::ios::right | std::ios::uppercase, 10, '_', "_____12345"},
{12345, std::ios::dec | std::ios::right | std::ios::uppercase | std::ios::showpos, 0, '_', "12345"},
{12345, std::ios::dec | std::ios::right | std::ios::uppercase | std::ios::showpos, 10, '_', "_____12345"},
{12345, std::ios::dec | std::ios::right | std::ios::uppercase | std::ios::showbase, 0, '_', "12345"},
{12345, std::ios::dec | std::ios::right | std::ios::uppercase | std::ios::showbase, 10, '_', "_____12345"},
{12345, std::ios::dec | std::ios::right | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 0, '_', "12345"},
{12345, std::ios::dec | std::ios::right | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 10, '_', "_____12345"},
{12345, std::ios::oct | std::ios::left, 0, '_', "30071"},
{12345, std::ios::oct | std::ios::left, 10, '_', "30071_____"},
{12345, std::ios::oct | std::ios::left | std::ios::showpos, 0, '_', "30071"},
{12345, std::ios::oct | std::ios::left | std::ios::showpos, 10, '_', "30071_____"},
{12345, std::ios::oct | std::ios::left | std::ios::showbase, 0, '_', "030071"},
{12345, std::ios::oct | std::ios::left | std::ios::showbase, 10, '_', "030071____"},
{12345, std::ios::oct | std::ios::left | std::ios::showbase | std::ios::showpos, 0, '_', "030071"},
{12345, std::ios::oct | std::ios::left | std::ios::showbase | std::ios::showpos, 10, '_', "030071____"},
{12345, std::ios::oct | std::ios::left | std::ios::uppercase, 0, '_', "30071"},
{12345, std::ios::oct | std::ios::left | std::ios::uppercase, 10, '_', "30071_____"},
{12345, std::ios::oct | std::ios::left | std::ios::uppercase | std::ios::showpos, 0, '_', "30071"},
{12345, std::ios::oct | std::ios::left | std::ios::uppercase | std::ios::showpos, 10, '_', "30071_____"},
{12345, std::ios::oct | std::ios::left | std::ios::uppercase | std::ios::showbase, 0, '_', "030071"},
{12345, std::ios::oct | std::ios::left | std::ios::uppercase | std::ios::showbase, 10, '_', "030071____"},
{12345, std::ios::oct | std::ios::left | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 0, '_', "030071"},
{12345, std::ios::oct | std::ios::left | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 10, '_', "030071____"},
{12345, std::ios::oct | std::ios::internal, 0, '_', "30071"},
{12345, std::ios::oct | std::ios::internal, 10, '_', "_____30071"},
{12345, std::ios::oct | std::ios::internal | std::ios::showpos, 0, '_', "30071"},
{12345, std::ios::oct | std::ios::internal | std::ios::showpos, 10, '_', "_____30071"},
{12345, std::ios::oct | std::ios::internal | std::ios::showbase, 0, '_', "030071"},
{12345, std::ios::oct | std::ios::internal | std::ios::showbase, 10, '_', "____030071"},
{12345, std::ios::oct | std::ios::internal | std::ios::showbase | std::ios::showpos, 0, '_', "030071"},
{12345, std::ios::oct | std::ios::internal | std::ios::showbase | std::ios::showpos, 10, '_', "____030071"},
{12345, std::ios::oct | std::ios::internal | std::ios::uppercase, 0, '_', "30071"},
{12345, std::ios::oct | std::ios::internal | std::ios::uppercase, 10, '_', "_____30071"},
{12345, std::ios::oct | std::ios::internal | std::ios::uppercase | std::ios::showpos, 0, '_', "30071"},
{12345, std::ios::oct | std::ios::internal | std::ios::uppercase | std::ios::showpos, 10, '_', "_____30071"},
{12345, std::ios::oct | std::ios::internal | std::ios::uppercase | std::ios::showbase, 0, '_', "030071"},
{12345, std::ios::oct | std::ios::internal | std::ios::uppercase | std::ios::showbase, 10, '_', "____030071"},
{12345, std::ios::oct | std::ios::internal | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 0, '_', "030071"},
{12345, std::ios::oct | std::ios::internal | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 10, '_', "____030071"},
{12345, std::ios::oct | std::ios::right, 0, '_', "30071"},
{12345, std::ios::oct | std::ios::right, 10, '_', "_____30071"},
{12345, std::ios::oct | std::ios::right | std::ios::showpos, 0, '_', "30071"},
{12345, std::ios::oct | std::ios::right | std::ios::showpos, 10, '_', "_____30071"},
{12345, std::ios::oct | std::ios::right | std::ios::showbase, 0, '_', "030071"},
{12345, std::ios::oct | std::ios::right | std::ios::showbase, 10, '_', "____030071"},
{12345, std::ios::oct | std::ios::right | std::ios::showbase | std::ios::showpos, 0, '_', "030071"},
{12345, std::ios::oct | std::ios::right | std::ios::showbase | std::ios::showpos, 10, '_', "____030071"},
{12345, std::ios::oct | std::ios::right | std::ios::uppercase, 0, '_', "30071"},
{12345, std::ios::oct | std::ios::right | std::ios::uppercase, 10, '_', "_____30071"},
{12345, std::ios::oct | std::ios::right | std::ios::uppercase | std::ios::showpos, 0, '_', "30071"},
{12345, std::ios::oct | std::ios::right | std::ios::uppercase | std::ios::showpos, 10, '_', "_____30071"},
{12345, std::ios::oct | std::ios::right | std::ios::uppercase | std::ios::showbase, 0, '_', "030071"},
{12345, std::ios::oct | std::ios::right | std::ios::uppercase | std::ios::showbase, 10, '_', "____030071"},
{12345, std::ios::oct | std::ios::right | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 0, '_', "030071"},
{12345, std::ios::oct | std::ios::right | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 10, '_', "____030071"},
{12345, std::ios::hex | std::ios::left, 0, '_', "3039"},
{12345, std::ios::hex | std::ios::left, 10, '_', "3039______"},
{12345, std::ios::hex | std::ios::left | std::ios::showpos, 0, '_', "3039"},
{12345, std::ios::hex | std::ios::left | std::ios::showpos, 10, '_', "3039______"},
{12345, std::ios::hex | std::ios::left | std::ios::showbase, 0, '_', "0x3039"},
{12345, std::ios::hex | std::ios::left | std::ios::showbase, 10, '_', "0x3039____"},
{12345, std::ios::hex | std::ios::left | std::ios::showbase | std::ios::showpos, 0, '_', "0x3039"},
{12345, std::ios::hex | std::ios::left | std::ios::showbase | std::ios::showpos, 10, '_', "0x3039____"},
{12345, std::ios::hex | std::ios::left | std::ios::uppercase, 0, '_', "3039"},
{12345, std::ios::hex | std::ios::left | std::ios::uppercase, 10, '_', "3039______"},
{12345, std::ios::hex | std::ios::left | std::ios::uppercase | std::ios::showpos, 0, '_', "3039"},
{12345, std::ios::hex | std::ios::left | std::ios::uppercase | std::ios::showpos, 10, '_', "3039______"},
{12345, std::ios::hex | std::ios::left | std::ios::uppercase | std::ios::showbase, 0, '_', "0X3039"},
{12345, std::ios::hex | std::ios::left | std::ios::uppercase | std::ios::showbase, 10, '_', "0X3039____"},
{12345, std::ios::hex | std::ios::left | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 0, '_', "0X3039"},
{12345, std::ios::hex | std::ios::left | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 10, '_', "0X3039____"},
{12345, std::ios::hex | std::ios::internal, 0, '_', "3039"},
{12345, std::ios::hex | std::ios::internal, 10, '_', "______3039"},
{12345, std::ios::hex | std::ios::internal | std::ios::showpos, 0, '_', "3039"},
{12345, std::ios::hex | std::ios::internal | std::ios::showpos, 10, '_', "______3039"},
{12345, std::ios::hex | std::ios::internal | std::ios::showbase, 0, '_', "0x3039"},
{12345, std::ios::hex | std::ios::internal | std::ios::showbase, 10, '_', "0x____3039"},
{12345, std::ios::hex | std::ios::internal | std::ios::showbase | std::ios::showpos, 0, '_', "0x3039"},
{12345, std::ios::hex | std::ios::internal | std::ios::showbase | std::ios::showpos, 10, '_', "0x____3039"},
{12345, std::ios::hex | std::ios::internal | std::ios::uppercase, 0, '_', "3039"},
{12345, std::ios::hex | std::ios::internal | std::ios::uppercase, 10, '_', "______3039"},
{12345, std::ios::hex | std::ios::internal | std::ios::uppercase | std::ios::showpos, 0, '_', "3039"},
{12345, std::ios::hex | std::ios::internal | std::ios::uppercase | std::ios::showpos, 10, '_', "______3039"},
{12345, std::ios::hex | std::ios::internal | std::ios::uppercase | std::ios::showbase, 0, '_', "0X3039"},
{12345, std::ios::hex | std::ios::internal | std::ios::uppercase | std::ios::showbase, 10, '_', "0X____3039"},
{12345, std::ios::hex | std::ios::internal | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 0, '_', "0X3039"},
{12345, std::ios::hex | std::ios::internal | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 10, '_', "0X____3039"},
{12345, std::ios::hex | std::ios::right, 0, '_', "3039"},
{12345, std::ios::hex | std::ios::right, 10, '_', "______3039"},
{12345, std::ios::hex | std::ios::right | std::ios::showpos, 0, '_', "3039"},
{12345, std::ios::hex | std::ios::right | std::ios::showpos, 10, '_', "______3039"},
{12345, std::ios::hex | std::ios::right | std::ios::showbase, 0, '_', "0x3039"},
{12345, std::ios::hex | std::ios::right | std::ios::showbase, 10, '_', "____0x3039"},
{12345, std::ios::hex | std::ios::right | std::ios::showbase | std::ios::showpos, 0, '_', "0x3039"},
{12345, std::ios::hex | std::ios::right | std::ios::showbase | std::ios::showpos, 10, '_', "____0x3039"},
{12345, std::ios::hex | std::ios::right | std::ios::uppercase, 0, '_', "3039"},
{12345, std::ios::hex | std::ios::right | std::ios::uppercase, 10, '_', "______3039"},
{12345, std::ios::hex | std::ios::right | std::ios::uppercase | std::ios::showpos, 0, '_', "3039"},
{12345, std::ios::hex | std::ios::right | std::ios::uppercase | std::ios::showpos, 10, '_', "______3039"},
{12345, std::ios::hex | std::ios::right | std::ios::uppercase | std::ios::showbase, 0, '_', "0X3039"},
{12345, std::ios::hex | std::ios::right | std::ios::uppercase | std::ios::showbase, 10, '_', "____0X3039"},
{12345, std::ios::hex | std::ios::right | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 0, '_', "0X3039"},
{12345, std::ios::hex | std::ios::right | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 10, '_', "____0X3039"},
{0x8000000000000000, std::ios::dec | std::ios::left, 0, '_', "9223372036854775808"},
{0x8000000000000000, std::ios::dec | std::ios::left, 10, '_', "9223372036854775808"},
{0x8000000000000000, std::ios::dec | std::ios::left | std::ios::showpos, 0, '_', "9223372036854775808"},
{0x8000000000000000, std::ios::dec | std::ios::left | std::ios::showpos, 10, '_', "9223372036854775808"},
{0x8000000000000000, std::ios::dec | std::ios::left | std::ios::showbase, 0, '_', "9223372036854775808"},
{0x8000000000000000, std::ios::dec | std::ios::left | std::ios::showbase, 10, '_', "9223372036854775808"},
{0x8000000000000000, std::ios::dec | std::ios::left | std::ios::showbase | std::ios::showpos, 0, '_', "9223372036854775808"},
{0x8000000000000000, std::ios::dec | std::ios::left | std::ios::showbase | std::ios::showpos, 10, '_', "9223372036854775808"},
{0x8000000000000000, std::ios::dec | std::ios::left | std::ios::uppercase, 0, '_', "9223372036854775808"},
{0x8000000000000000, std::ios::dec | std::ios::left | std::ios::uppercase, 10, '_', "9223372036854775808"},
{0x8000000000000000, std::ios::dec | std::ios::left | std::ios::uppercase | std::ios::showpos, 0, '_', "9223372036854775808"},
{0x8000000000000000, std::ios::dec | std::ios::left | std::ios::uppercase | std::ios::showpos, 10, '_', "9223372036854775808"},
{0x8000000000000000, std::ios::dec | std::ios::left | std::ios::uppercase | std::ios::showbase, 0, '_', "9223372036854775808"},
{0x8000000000000000, std::ios::dec | std::ios::left | std::ios::uppercase | std::ios::showbase, 10, '_', "9223372036854775808"},
{0x8000000000000000, std::ios::dec | std::ios::left | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 0, '_', "9223372036854775808"},
{0x8000000000000000, std::ios::dec | std::ios::left | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 10, '_', "9223372036854775808"},
{0x8000000000000000, std::ios::dec | std::ios::internal, 0, '_', "9223372036854775808"},
{0x8000000000000000, std::ios::dec | std::ios::internal, 10, '_', "9223372036854775808"},
{0x8000000000000000, std::ios::dec | std::ios::internal | std::ios::showpos, 0, '_', "9223372036854775808"},
{0x8000000000000000, std::ios::dec | std::ios::internal | std::ios::showpos, 10, '_', "9223372036854775808"},
{0x8000000000000000, std::ios::dec | std::ios::internal | std::ios::showbase, 0, '_', "9223372036854775808"},
{0x8000000000000000, std::ios::dec | std::ios::internal | std::ios::showbase, 10, '_', "9223372036854775808"},
{0x8000000000000000, std::ios::dec | std::ios::internal | std::ios::showbase | std::ios::showpos, 0, '_', "9223372036854775808"},
{0x8000000000000000, std::ios::dec | std::ios::internal | std::ios::showbase | std::ios::showpos, 10, '_', "9223372036854775808"},
{0x8000000000000000, std::ios::dec | std::ios::internal | std::ios::uppercase, 0, '_', "9223372036854775808"},
{0x8000000000000000, std::ios::dec | std::ios::internal | std::ios::uppercase, 10, '_', "9223372036854775808"},
{0x8000000000000000, std::ios::dec | std::ios::internal | std::ios::uppercase | std::ios::showpos, 0, '_', "9223372036854775808"},
{0x8000000000000000, std::ios::dec | std::ios::internal | std::ios::uppercase | std::ios::showpos, 10, '_', "9223372036854775808"},
{0x8000000000000000, std::ios::dec | std::ios::internal | std::ios::uppercase | std::ios::showbase, 0, '_', "9223372036854775808"},
{0x8000000000000000, std::ios::dec | std::ios::internal | std::ios::uppercase | std::ios::showbase, 10, '_', "9223372036854775808"},
{0x8000000000000000, std::ios::dec | std::ios::internal | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 0, '_', "9223372036854775808"},
{0x8000000000000000, std::ios::dec | std::ios::internal | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 10, '_', "9223372036854775808"},
{0x8000000000000000, std::ios::dec | std::ios::right, 0, '_', "9223372036854775808"},
{0x8000000000000000, std::ios::dec | std::ios::right, 10, '_', "9223372036854775808"},
{0x8000000000000000, std::ios::dec | std::ios::right | std::ios::showpos, 0, '_', "9223372036854775808"},
{0x8000000000000000, std::ios::dec | std::ios::right | std::ios::showpos, 10, '_', "9223372036854775808"},
{0x8000000000000000, std::ios::dec | std::ios::right | std::ios::showbase, 0, '_', "9223372036854775808"},
{0x8000000000000000, std::ios::dec | std::ios::right | std::ios::showbase, 10, '_', "9223372036854775808"},
{0x8000000000000000, std::ios::dec | std::ios::right | std::ios::showbase | std::ios::showpos, 0, '_', "9223372036854775808"},
{0x8000000000000000, std::ios::dec | std::ios::right | std::ios::showbase | std::ios::showpos, 10, '_', "9223372036854775808"},
{0x8000000000000000, std::ios::dec | std::ios::right | std::ios::uppercase, 0, '_', "9223372036854775808"},
{0x8000000000000000, std::ios::dec | std::ios::right | std::ios::uppercase, 10, '_', "9223372036854775808"},
{0x8000000000000000, std::ios::dec | std::ios::right | std::ios::uppercase | std::ios::showpos, 0, '_', "9223372036854775808"},
{0x8000000000000000, std::ios::dec | std::ios::right | std::ios::uppercase | std::ios::showpos, 10, '_', "9223372036854775808"},
{0x8000000000000000, std::ios::dec | std::ios::right | std::ios::uppercase | std::ios::showbase, 0, '_', "9223372036854775808"},
{0x8000000000000000, std::ios::dec | std::ios::right | std::ios::uppercase | std::ios::showbase, 10, '_', "9223372036854775808"},
{0x8000000000000000, std::ios::dec | std::ios::right | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 0, '_', "9223372036854775808"},
{0x8000000000000000, std::ios::dec | std::ios::right | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 10, '_', "9223372036854775808"},
{0x8000000000000000, std::ios::oct | std::ios::left, 0, '_', "1000000000000000000000"},
{0x8000000000000000, std::ios::oct | std::ios::left, 10, '_', "1000000000000000000000"},
{0x8000000000000000, std::ios::oct | std::ios::left | std::ios::showpos, 0, '_', "1000000000000000000000"},
{0x8000000000000000, std::ios::oct | std::ios::left | std::ios::showpos, 10, '_', "1000000000000000000000"},
{0x8000000000000000, std::ios::oct | std::ios::left | std::ios::showbase, 0, '_', "01000000000000000000000"},
{0x8000000000000000, std::ios::oct | std::ios::left | std::ios::showbase, 10, '_', "01000000000000000000000"},
{0x8000000000000000, std::ios::oct | std::ios::left | std::ios::showbase | std::ios::showpos, 0, '_', "01000000000000000000000"},
{0x8000000000000000, std::ios::oct | std::ios::left | std::ios::showbase | std::ios::showpos, 10, '_', "01000000000000000000000"},
{0x8000000000000000, std::ios::oct | std::ios::left | std::ios::uppercase, 0, '_', "1000000000000000000000"},
{0x8000000000000000, std::ios::oct | std::ios::left | std::ios::uppercase, 10, '_', "1000000000000000000000"},
{0x8000000000000000, std::ios::oct | std::ios::left | std::ios::uppercase | std::ios::showpos, 0, '_', "1000000000000000000000"},
{0x8000000000000000, std::ios::oct | std::ios::left | std::ios::uppercase | std::ios::showpos, 10, '_', "1000000000000000000000"},
{0x8000000000000000, std::ios::oct | std::ios::left | std::ios::uppercase | std::ios::showbase, 0, '_', "01000000000000000000000"},
{0x8000000000000000, std::ios::oct | std::ios::left | std::ios::uppercase | std::ios::showbase, 10, '_', "01000000000000000000000"},
{0x8000000000000000, std::ios::oct | std::ios::left | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 0, '_', "01000000000000000000000"},
{0x8000000000000000, std::ios::oct | std::ios::left | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 10, '_', "01000000000000000000000"},
{0x8000000000000000, std::ios::oct | std::ios::internal, 0, '_', "1000000000000000000000"},
{0x8000000000000000, std::ios::oct | std::ios::internal, 10, '_', "1000000000000000000000"},
{0x8000000000000000, std::ios::oct | std::ios::internal | std::ios::showpos, 0, '_', "1000000000000000000000"},
{0x8000000000000000, std::ios::oct | std::ios::internal | std::ios::showpos, 10, '_', "1000000000000000000000"},
{0x8000000000000000, std::ios::oct | std::ios::internal | std::ios::showbase, 0, '_', "01000000000000000000000"},
{0x8000000000000000, std::ios::oct | std::ios::internal | std::ios::showbase, 10, '_', "01000000000000000000000"},
{0x8000000000000000, std::ios::oct | std::ios::internal | std::ios::showbase | std::ios::showpos, 0, '_', "01000000000000000000000"},
{0x8000000000000000, std::ios::oct | std::ios::internal | std::ios::showbase | std::ios::showpos, 10, '_', "01000000000000000000000"},
{0x8000000000000000, std::ios::oct | std::ios::internal | std::ios::uppercase, 0, '_', "1000000000000000000000"},
{0x8000000000000000, std::ios::oct | std::ios::internal | std::ios::uppercase, 10, '_', "1000000000000000000000"},
{0x8000000000000000, std::ios::oct | std::ios::internal | std::ios::uppercase | std::ios::showpos, 0, '_', "1000000000000000000000"},
{0x8000000000000000, std::ios::oct | std::ios::internal | std::ios::uppercase | std::ios::showpos, 10, '_', "1000000000000000000000"},
{0x8000000000000000, std::ios::oct | std::ios::internal | std::ios::uppercase | std::ios::showbase, 0, '_', "01000000000000000000000"},
{0x8000000000000000, std::ios::oct | std::ios::internal | std::ios::uppercase | std::ios::showbase, 10, '_', "01000000000000000000000"},
{0x8000000000000000, std::ios::oct | std::ios::internal | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 0, '_', "01000000000000000000000"},
{0x8000000000000000, std::ios::oct | std::ios::internal | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 10, '_', "01000000000000000000000"},
{0x8000000000000000, std::ios::oct | std::ios::right, 0, '_', "1000000000000000000000"},
{0x8000000000000000, std::ios::oct | std::ios::right, 10, '_', "1000000000000000000000"},
{0x8000000000000000, std::ios::oct | std::ios::right | std::ios::showpos, 0, '_', "1000000000000000000000"},
{0x8000000000000000, std::ios::oct | std::ios::right | std::ios::showpos, 10, '_', "1000000000000000000000"},
{0x8000000000000000, std::ios::oct | std::ios::right | std::ios::showbase, 0, '_', "01000000000000000000000"},
{0x8000000000000000, std::ios::oct | std::ios::right | std::ios::showbase, 10, '_', "01000000000000000000000"},
{0x8000000000000000, std::ios::oct | std::ios::right | std::ios::showbase | std::ios::showpos, 0, '_', "01000000000000000000000"},
{0x8000000000000000, std::ios::oct | std::ios::right | std::ios::showbase | std::ios::showpos, 10, '_', "01000000000000000000000"},
{0x8000000000000000, std::ios::oct | std::ios::right | std::ios::uppercase, 0, '_', "1000000000000000000000"},
{0x8000000000000000, std::ios::oct | std::ios::right | std::ios::uppercase, 10, '_', "1000000000000000000000"},
{0x8000000000000000, std::ios::oct | std::ios::right | std::ios::uppercase | std::ios::showpos, 0, '_', "1000000000000000000000"},
{0x8000000000000000, std::ios::oct | std::ios::right | std::ios::uppercase | std::ios::showpos, 10, '_', "1000000000000000000000"},
{0x8000000000000000, std::ios::oct | std::ios::right | std::ios::uppercase | std::ios::showbase, 0, '_', "01000000000000000000000"},
{0x8000000000000000, std::ios::oct | std::ios::right | std::ios::uppercase | std::ios::showbase, 10, '_', "01000000000000000000000"},
{0x8000000000000000, std::ios::oct | std::ios::right | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 0, '_', "01000000000000000000000"},
{0x8000000000000000, std::ios::oct | std::ios::right | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 10, '_', "01000000000000000000000"},
{0x8000000000000000, std::ios::hex | std::ios::left, 0, '_', "8000000000000000"},
{0x8000000000000000, std::ios::hex | std::ios::left, 10, '_', "8000000000000000"},
{0x8000000000000000, std::ios::hex | std::ios::left | std::ios::showpos, 0, '_', "8000000000000000"},
{0x8000000000000000, std::ios::hex | std::ios::left | std::ios::showpos, 10, '_', "8000000000000000"},
{0x8000000000000000, std::ios::hex | std::ios::left | std::ios::showbase, 0, '_', "0x8000000000000000"},
{0x8000000000000000, std::ios::hex | std::ios::left | std::ios::showbase, 10, '_', "0x8000000000000000"},
{0x8000000000000000, std::ios::hex | std::ios::left | std::ios::showbase | std::ios::showpos, 0, '_', "0x8000000000000000"},
{0x8000000000000000, std::ios::hex | std::ios::left | std::ios::showbase | std::ios::showpos, 10, '_', "0x8000000000000000"},
{0x8000000000000000, std::ios::hex | std::ios::left | std::ios::uppercase, 0, '_', "8000000000000000"},
{0x8000000000000000, std::ios::hex | std::ios::left | std::ios::uppercase, 10, '_', "8000000000000000"},
{0x8000000000000000, std::ios::hex | std::ios::left | std::ios::uppercase | std::ios::showpos, 0, '_', "8000000000000000"},
{0x8000000000000000, std::ios::hex | std::ios::left | std::ios::uppercase | std::ios::showpos, 10, '_', "8000000000000000"},
{0x8000000000000000, std::ios::hex | std::ios::left | std::ios::uppercase | std::ios::showbase, 0, '_', "0X8000000000000000"},
{0x8000000000000000, std::ios::hex | std::ios::left | std::ios::uppercase | std::ios::showbase, 10, '_', "0X8000000000000000"},
{0x8000000000000000, std::ios::hex | std::ios::left | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 0, '_', "0X8000000000000000"},
{0x8000000000000000, std::ios::hex | std::ios::left | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 10, '_', "0X8000000000000000"},
{0x8000000000000000, std::ios::hex | std::ios::internal, 0, '_', "8000000000000000"},
{0x8000000000000000, std::ios::hex | std::ios::internal, 10, '_', "8000000000000000"},
{0x8000000000000000, std::ios::hex | std::ios::internal | std::ios::showpos, 0, '_', "8000000000000000"},
{0x8000000000000000, std::ios::hex | std::ios::internal | std::ios::showpos, 10, '_', "8000000000000000"},
{0x8000000000000000, std::ios::hex | std::ios::internal | std::ios::showbase, 0, '_', "0x8000000000000000"},
{0x8000000000000000, std::ios::hex | std::ios::internal | std::ios::showbase, 10, '_', "0x8000000000000000"},
{0x8000000000000000, std::ios::hex | std::ios::internal | std::ios::showbase | std::ios::showpos, 0, '_', "0x8000000000000000"},
{0x8000000000000000, std::ios::hex | std::ios::internal | std::ios::showbase | std::ios::showpos, 10, '_', "0x8000000000000000"},
{0x8000000000000000, std::ios::hex | std::ios::internal | std::ios::uppercase, 0, '_', "8000000000000000"},
{0x8000000000000000, std::ios::hex | std::ios::internal | std::ios::uppercase, 10, '_', "8000000000000000"},
{0x8000000000000000, std::ios::hex | std::ios::internal | std::ios::uppercase | std::ios::showpos, 0, '_', "8000000000000000"},
{0x8000000000000000, std::ios::hex | std::ios::internal | std::ios::uppercase | std::ios::showpos, 10, '_', "8000000000000000"},
{0x8000000000000000, std::ios::hex | std::ios::internal | std::ios::uppercase | std::ios::showbase, 0, '_', "0X8000000000000000"},
{0x8000000000000000, std::ios::hex | std::ios::internal | std::ios::uppercase | std::ios::showbase, 10, '_', "0X8000000000000000"},
{0x8000000000000000, std::ios::hex | std::ios::internal | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 0, '_', "0X8000000000000000"},
{0x8000000000000000, std::ios::hex | std::ios::internal | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 10, '_', "0X8000000000000000"},
{0x8000000000000000, std::ios::hex | std::ios::right, 0, '_', "8000000000000000"},
{0x8000000000000000, std::ios::hex | std::ios::right, 10, '_', "8000000000000000"},
{0x8000000000000000, std::ios::hex | std::ios::right | std::ios::showpos, 0, '_', "8000000000000000"},
{0x8000000000000000, std::ios::hex | std::ios::right | std::ios::showpos, 10, '_', "8000000000000000"},
{0x8000000000000000, std::ios::hex | std::ios::right | std::ios::showbase, 0, '_', "0x8000000000000000"},
{0x8000000000000000, std::ios::hex | std::ios::right | std::ios::showbase, 10, '_', "0x8000000000000000"},
{0x8000000000000000, std::ios::hex | std::ios::right | std::ios::showbase | std::ios::showpos, 0, '_', "0x8000000000000000"},
{0x8000000000000000, std::ios::hex | std::ios::right | std::ios::showbase | std::ios::showpos, 10, '_', "0x8000000000000000"},
{0x8000000000000000, std::ios::hex | std::ios::right | std::ios::uppercase, 0, '_', "8000000000000000"},
{0x8000000000000000, std::ios::hex | std::ios::right | std::ios::uppercase, 10, '_', "8000000000000000"},
{0x8000000000000000, std::ios::hex | std::ios::right | std::ios::uppercase | std::ios::showpos, 0, '_', "8000000000000000"},
{0x8000000000000000, std::ios::hex | std::ios::right | std::ios::uppercase | std::ios::showpos, 10, '_', "8000000000000000"},
{0x8000000000000000, std::ios::hex | std::ios::right | std::ios::uppercase | std::ios::showbase, 0, '_', "0X8000000000000000"},
{0x8000000000000000, std::ios::hex | std::ios::right | std::ios::uppercase | std::ios::showbase, 10, '_', "0X8000000000000000"},
{0x8000000000000000, std::ios::hex | std::ios::right | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 0, '_', "0X8000000000000000"},
{0x8000000000000000, std::ios::hex | std::ios::right | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 10, '_', "0X8000000000000000"},
{std::numeric_limits<uint64_t>::max(), std::ios::dec | std::ios::left, 0, '_', "18446744073709551615"},
{std::numeric_limits<uint64_t>::max(), std::ios::dec | std::ios::left, 10, '_', "18446744073709551615"},
{std::numeric_limits<uint64_t>::max(), std::ios::dec | std::ios::left | std::ios::showpos, 0, '_', "18446744073709551615"},
{std::numeric_limits<uint64_t>::max(), std::ios::dec | std::ios::left | std::ios::showpos, 10, '_', "18446744073709551615"},
{std::numeric_limits<uint64_t>::max(), std::ios::dec | std::ios::left | std::ios::showbase, 0, '_', "18446744073709551615"},
{std::numeric_limits<uint64_t>::max(), std::ios::dec | std::ios::left | std::ios::showbase, 10, '_', "18446744073709551615"},
{std::numeric_limits<uint64_t>::max(), std::ios::dec | std::ios::left | std::ios::showbase | std::ios::showpos, 0, '_', "18446744073709551615"},
{std::numeric_limits<uint64_t>::max(), std::ios::dec | std::ios::left | std::ios::showbase | std::ios::showpos, 10, '_', "18446744073709551615"},
{std::numeric_limits<uint64_t>::max(), std::ios::dec | std::ios::left | std::ios::uppercase, 0, '_', "18446744073709551615"},
{std::numeric_limits<uint64_t>::max(), std::ios::dec | std::ios::left | std::ios::uppercase, 10, '_', "18446744073709551615"},
{std::numeric_limits<uint64_t>::max(), std::ios::dec | std::ios::left | std::ios::uppercase | std::ios::showpos, 0, '_', "18446744073709551615"},
{std::numeric_limits<uint64_t>::max(), std::ios::dec | std::ios::left | std::ios::uppercase | std::ios::showpos, 10, '_', "18446744073709551615"},
{std::numeric_limits<uint64_t>::max(), std::ios::dec | std::ios::left | std::ios::uppercase | std::ios::showbase, 0, '_', "18446744073709551615"},
{std::numeric_limits<uint64_t>::max(), std::ios::dec | std::ios::left | std::ios::uppercase | std::ios::showbase, 10, '_', "18446744073709551615"},
{std::numeric_limits<uint64_t>::max(), std::ios::dec | std::ios::left | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 0, '_', "18446744073709551615"},
{std::numeric_limits<uint64_t>::max(), std::ios::dec | std::ios::left | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 10, '_', "18446744073709551615"},
{std::numeric_limits<uint64_t>::max(), std::ios::dec | std::ios::internal, 0, '_', "18446744073709551615"},
{std::numeric_limits<uint64_t>::max(), std::ios::dec | std::ios::internal, 10, '_', "18446744073709551615"},
{std::numeric_limits<uint64_t>::max(), std::ios::dec | std::ios::internal | std::ios::showpos, 0, '_', "18446744073709551615"},
{std::numeric_limits<uint64_t>::max(), std::ios::dec | std::ios::internal | std::ios::showpos, 10, '_', "18446744073709551615"},
{std::numeric_limits<uint64_t>::max(), std::ios::dec | std::ios::internal | std::ios::showbase, 0, '_', "18446744073709551615"},
{std::numeric_limits<uint64_t>::max(), std::ios::dec | std::ios::internal | std::ios::showbase, 10, '_', "18446744073709551615"},
{std::numeric_limits<uint64_t>::max(), std::ios::dec | std::ios::internal | std::ios::showbase | std::ios::showpos, 0, '_', "18446744073709551615"},
{std::numeric_limits<uint64_t>::max(), std::ios::dec | std::ios::internal | std::ios::showbase | std::ios::showpos, 10, '_', "18446744073709551615"},
{std::numeric_limits<uint64_t>::max(), std::ios::dec | std::ios::internal | std::ios::uppercase, 0, '_', "18446744073709551615"},
{std::numeric_limits<uint64_t>::max(), std::ios::dec | std::ios::internal | std::ios::uppercase, 10, '_', "18446744073709551615"},
{std::numeric_limits<uint64_t>::max(), std::ios::dec | std::ios::internal | std::ios::uppercase | std::ios::showpos, 0, '_', "18446744073709551615"},
{std::numeric_limits<uint64_t>::max(), std::ios::dec | std::ios::internal | std::ios::uppercase | std::ios::showpos, 10, '_', "18446744073709551615"},
{std::numeric_limits<uint64_t>::max(), std::ios::dec | std::ios::internal | std::ios::uppercase | std::ios::showbase, 0, '_', "18446744073709551615"},
{std::numeric_limits<uint64_t>::max(), std::ios::dec | std::ios::internal | std::ios::uppercase | std::ios::showbase, 10, '_', "18446744073709551615"},
{std::numeric_limits<uint64_t>::max(), std::ios::dec | std::ios::internal | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 0, '_', "18446744073709551615"},
{std::numeric_limits<uint64_t>::max(), std::ios::dec | std::ios::internal | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 10, '_', "18446744073709551615"},
{std::numeric_limits<uint64_t>::max(), std::ios::dec | std::ios::right, 0, '_', "18446744073709551615"},
{std::numeric_limits<uint64_t>::max(), std::ios::dec | std::ios::right, 10, '_', "18446744073709551615"},
{std::numeric_limits<uint64_t>::max(), std::ios::dec | std::ios::right | std::ios::showpos, 0, '_', "18446744073709551615"},
{std::numeric_limits<uint64_t>::max(), std::ios::dec | std::ios::right | std::ios::showpos, 10, '_', "18446744073709551615"},
{std::numeric_limits<uint64_t>::max(), std::ios::dec | std::ios::right | std::ios::showbase, 0, '_', "18446744073709551615"},
{std::numeric_limits<uint64_t>::max(), std::ios::dec | std::ios::right | std::ios::showbase, 10, '_', "18446744073709551615"},
{std::numeric_limits<uint64_t>::max(), std::ios::dec | std::ios::right | std::ios::showbase | std::ios::showpos, 0, '_', "18446744073709551615"},
{std::numeric_limits<uint64_t>::max(), std::ios::dec | std::ios::right | std::ios::showbase | std::ios::showpos, 10, '_', "18446744073709551615"},
{std::numeric_limits<uint64_t>::max(), std::ios::dec | std::ios::right | std::ios::uppercase, 0, '_', "18446744073709551615"},
{std::numeric_limits<uint64_t>::max(), std::ios::dec | std::ios::right | std::ios::uppercase, 10, '_', "18446744073709551615"},
{std::numeric_limits<uint64_t>::max(), std::ios::dec | std::ios::right | std::ios::uppercase | std::ios::showpos, 0, '_', "18446744073709551615"},
{std::numeric_limits<uint64_t>::max(), std::ios::dec | std::ios::right | std::ios::uppercase | std::ios::showpos, 10, '_', "18446744073709551615"},
{std::numeric_limits<uint64_t>::max(), std::ios::dec | std::ios::right | std::ios::uppercase | std::ios::showbase, 0, '_', "18446744073709551615"},
{std::numeric_limits<uint64_t>::max(), std::ios::dec | std::ios::right | std::ios::uppercase | std::ios::showbase, 10, '_', "18446744073709551615"},
{std::numeric_limits<uint64_t>::max(), std::ios::dec | std::ios::right | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 0, '_', "18446744073709551615"},
{std::numeric_limits<uint64_t>::max(), std::ios::dec | std::ios::right | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 10, '_', "18446744073709551615"},
{std::numeric_limits<uint64_t>::max(), std::ios::oct | std::ios::left, 0, '_', "1777777777777777777777"},
{std::numeric_limits<uint64_t>::max(), std::ios::oct | std::ios::left, 10, '_', "1777777777777777777777"},
{std::numeric_limits<uint64_t>::max(), std::ios::oct | std::ios::left | std::ios::showpos, 0, '_', "1777777777777777777777"},
{std::numeric_limits<uint64_t>::max(), std::ios::oct | std::ios::left | std::ios::showpos, 10, '_', "1777777777777777777777"},
{std::numeric_limits<uint64_t>::max(), std::ios::oct | std::ios::left | std::ios::showbase, 0, '_', "01777777777777777777777"},
{std::numeric_limits<uint64_t>::max(), std::ios::oct | std::ios::left | std::ios::showbase, 10, '_', "01777777777777777777777"},
{std::numeric_limits<uint64_t>::max(), std::ios::oct | std::ios::left | std::ios::showbase | std::ios::showpos, 0, '_', "01777777777777777777777"},
{std::numeric_limits<uint64_t>::max(), std::ios::oct | std::ios::left | std::ios::showbase | std::ios::showpos, 10, '_', "01777777777777777777777"},
{std::numeric_limits<uint64_t>::max(), std::ios::oct | std::ios::left | std::ios::uppercase, 0, '_', "1777777777777777777777"},
{std::numeric_limits<uint64_t>::max(), std::ios::oct | std::ios::left | std::ios::uppercase, 10, '_', "1777777777777777777777"},
{std::numeric_limits<uint64_t>::max(), std::ios::oct | std::ios::left | std::ios::uppercase | std::ios::showpos, 0, '_', "1777777777777777777777"},
{std::numeric_limits<uint64_t>::max(), std::ios::oct | std::ios::left | std::ios::uppercase | std::ios::showpos, 10, '_', "1777777777777777777777"},
{std::numeric_limits<uint64_t>::max(), std::ios::oct | std::ios::left | std::ios::uppercase | std::ios::showbase, 0, '_', "01777777777777777777777"},
{std::numeric_limits<uint64_t>::max(), std::ios::oct | std::ios::left | std::ios::uppercase | std::ios::showbase, 10, '_', "01777777777777777777777"},
{std::numeric_limits<uint64_t>::max(), std::ios::oct | std::ios::left | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 0, '_', "01777777777777777777777"},
{std::numeric_limits<uint64_t>::max(), std::ios::oct | std::ios::left | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 10, '_', "01777777777777777777777"},
{std::numeric_limits<uint64_t>::max(), std::ios::oct | std::ios::internal, 0, '_', "1777777777777777777777"},
{std::numeric_limits<uint64_t>::max(), std::ios::oct | std::ios::internal, 10, '_', "1777777777777777777777"},
{std::numeric_limits<uint64_t>::max(), std::ios::oct | std::ios::internal | std::ios::showpos, 0, '_', "1777777777777777777777"},
{std::numeric_limits<uint64_t>::max(), std::ios::oct | std::ios::internal | std::ios::showpos, 10, '_', "1777777777777777777777"},
{std::numeric_limits<uint64_t>::max(), std::ios::oct | std::ios::internal | std::ios::showbase, 0, '_', "01777777777777777777777"},
{std::numeric_limits<uint64_t>::max(), std::ios::oct | std::ios::internal | std::ios::showbase, 10, '_', "01777777777777777777777"},
{std::numeric_limits<uint64_t>::max(), std::ios::oct | std::ios::internal | std::ios::showbase | std::ios::showpos, 0, '_', "01777777777777777777777"},
{std::numeric_limits<uint64_t>::max(), std::ios::oct | std::ios::internal | std::ios::showbase | std::ios::showpos, 10, '_', "01777777777777777777777"},
{std::numeric_limits<uint64_t>::max(), std::ios::oct | std::ios::internal | std::ios::uppercase, 0, '_', "1777777777777777777777"},
{std::numeric_limits<uint64_t>::max(), std::ios::oct | std::ios::internal | std::ios::uppercase, 10, '_', "1777777777777777777777"},
{std::numeric_limits<uint64_t>::max(), std::ios::oct | std::ios::internal | std::ios::uppercase | std::ios::showpos, 0, '_', "1777777777777777777777"},
{std::numeric_limits<uint64_t>::max(), std::ios::oct | std::ios::internal | std::ios::uppercase | std::ios::showpos, 10, '_', "1777777777777777777777"},
{std::numeric_limits<uint64_t>::max(), std::ios::oct | std::ios::internal | std::ios::uppercase | std::ios::showbase, 0, '_', "01777777777777777777777"},
{std::numeric_limits<uint64_t>::max(), std::ios::oct | std::ios::internal | std::ios::uppercase | std::ios::showbase, 10, '_', "01777777777777777777777"},
{std::numeric_limits<uint64_t>::max(), std::ios::oct | std::ios::internal | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 0, '_', "01777777777777777777777"},
{std::numeric_limits<uint64_t>::max(), std::ios::oct | std::ios::internal | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 10, '_', "01777777777777777777777"},
{std::numeric_limits<uint64_t>::max(), std::ios::oct | std::ios::right, 0, '_', "1777777777777777777777"},
{std::numeric_limits<uint64_t>::max(), std::ios::oct | std::ios::right, 10, '_', "1777777777777777777777"},
{std::numeric_limits<uint64_t>::max(), std::ios::oct | std::ios::right | std::ios::showpos, 0, '_', "1777777777777777777777"},
{std::numeric_limits<uint64_t>::max(), std::ios::oct | std::ios::right | std::ios::showpos, 10, '_', "1777777777777777777777"},
{std::numeric_limits<uint64_t>::max(), std::ios::oct | std::ios::right | std::ios::showbase, 0, '_', "01777777777777777777777"},
{std::numeric_limits<uint64_t>::max(), std::ios::oct | std::ios::right | std::ios::showbase, 10, '_', "01777777777777777777777"},
{std::numeric_limits<uint64_t>::max(), std::ios::oct | std::ios::right | std::ios::showbase | std::ios::showpos, 0, '_', "01777777777777777777777"},
{std::numeric_limits<uint64_t>::max(), std::ios::oct | std::ios::right | std::ios::showbase | std::ios::showpos, 10, '_', "01777777777777777777777"},
{std::numeric_limits<uint64_t>::max(), std::ios::oct | std::ios::right | std::ios::uppercase, 0, '_', "1777777777777777777777"},
{std::numeric_limits<uint64_t>::max(), std::ios::oct | std::ios::right | std::ios::uppercase, 10, '_', "1777777777777777777777"},
{std::numeric_limits<uint64_t>::max(), std::ios::oct | std::ios::right | std::ios::uppercase | std::ios::showpos, 0, '_', "1777777777777777777777"},
{std::numeric_limits<uint64_t>::max(), std::ios::oct | std::ios::right | std::ios::uppercase | std::ios::showpos, 10, '_', "1777777777777777777777"},
{std::numeric_limits<uint64_t>::max(), std::ios::oct | std::ios::right | std::ios::uppercase | std::ios::showbase, 0, '_', "01777777777777777777777"},
{std::numeric_limits<uint64_t>::max(), std::ios::oct | std::ios::right | std::ios::uppercase | std::ios::showbase, 10, '_', "01777777777777777777777"},
{std::numeric_limits<uint64_t>::max(), std::ios::oct | std::ios::right | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 0, '_', "01777777777777777777777"},
{std::numeric_limits<uint64_t>::max(), std::ios::oct | std::ios::right | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 10, '_', "01777777777777777777777"},
{std::numeric_limits<uint64_t>::max(), std::ios::hex | std::ios::left, 0, '_', "ffffffffffffffff"},
{std::numeric_limits<uint64_t>::max(), std::ios::hex | std::ios::left, 10, '_', "ffffffffffffffff"},
{std::numeric_limits<uint64_t>::max(), std::ios::hex | std::ios::left | std::ios::showpos, 0, '_', "ffffffffffffffff"},
{std::numeric_limits<uint64_t>::max(), std::ios::hex | std::ios::left | std::ios::showpos, 10, '_', "ffffffffffffffff"},
{std::numeric_limits<uint64_t>::max(), std::ios::hex | std::ios::left | std::ios::showbase, 0, '_', "0xffffffffffffffff"},
{std::numeric_limits<uint64_t>::max(), std::ios::hex | std::ios::left | std::ios::showbase, 10, '_', "0xffffffffffffffff"},
{std::numeric_limits<uint64_t>::max(), std::ios::hex | std::ios::left | std::ios::showbase | std::ios::showpos, 0, '_', "0xffffffffffffffff"},
{std::numeric_limits<uint64_t>::max(), std::ios::hex | std::ios::left | std::ios::showbase | std::ios::showpos, 10, '_', "0xffffffffffffffff"},
{std::numeric_limits<uint64_t>::max(), std::ios::hex | std::ios::left | std::ios::uppercase, 0, '_', "FFFFFFFFFFFFFFFF"},
{std::numeric_limits<uint64_t>::max(), std::ios::hex | std::ios::left | std::ios::uppercase, 10, '_', "FFFFFFFFFFFFFFFF"},
{std::numeric_limits<uint64_t>::max(), std::ios::hex | std::ios::left | std::ios::uppercase | std::ios::showpos, 0, '_', "FFFFFFFFFFFFFFFF"},
{std::numeric_limits<uint64_t>::max(), std::ios::hex | std::ios::left | std::ios::uppercase | std::ios::showpos, 10, '_', "FFFFFFFFFFFFFFFF"},
{std::numeric_limits<uint64_t>::max(), std::ios::hex | std::ios::left | std::ios::uppercase | std::ios::showbase, 0, '_', "0XFFFFFFFFFFFFFFFF"},
{std::numeric_limits<uint64_t>::max(), std::ios::hex | std::ios::left | std::ios::uppercase | std::ios::showbase, 10, '_', "0XFFFFFFFFFFFFFFFF"},
{std::numeric_limits<uint64_t>::max(), std::ios::hex | std::ios::left | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 0, '_', "0XFFFFFFFFFFFFFFFF"},
{std::numeric_limits<uint64_t>::max(), std::ios::hex | std::ios::left | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 10, '_', "0XFFFFFFFFFFFFFFFF"},
{std::numeric_limits<uint64_t>::max(), std::ios::hex | std::ios::internal, 0, '_', "ffffffffffffffff"},
{std::numeric_limits<uint64_t>::max(), std::ios::hex | std::ios::internal, 10, '_', "ffffffffffffffff"},
{std::numeric_limits<uint64_t>::max(), std::ios::hex | std::ios::internal | std::ios::showpos, 0, '_', "ffffffffffffffff"},
{std::numeric_limits<uint64_t>::max(), std::ios::hex | std::ios::internal | std::ios::showpos, 10, '_', "ffffffffffffffff"},
{std::numeric_limits<uint64_t>::max(), std::ios::hex | std::ios::internal | std::ios::showbase, 0, '_', "0xffffffffffffffff"},
{std::numeric_limits<uint64_t>::max(), std::ios::hex | std::ios::internal | std::ios::showbase, 10, '_', "0xffffffffffffffff"},
{std::numeric_limits<uint64_t>::max(), std::ios::hex | std::ios::internal | std::ios::showbase | std::ios::showpos, 0, '_', "0xffffffffffffffff"},
{std::numeric_limits<uint64_t>::max(), std::ios::hex | std::ios::internal | std::ios::showbase | std::ios::showpos, 10, '_', "0xffffffffffffffff"},
{std::numeric_limits<uint64_t>::max(), std::ios::hex | std::ios::internal | std::ios::uppercase, 0, '_', "FFFFFFFFFFFFFFFF"},
{std::numeric_limits<uint64_t>::max(), std::ios::hex | std::ios::internal | std::ios::uppercase, 10, '_', "FFFFFFFFFFFFFFFF"},
{std::numeric_limits<uint64_t>::max(), std::ios::hex | std::ios::internal | std::ios::uppercase | std::ios::showpos, 0, '_', "FFFFFFFFFFFFFFFF"},
{std::numeric_limits<uint64_t>::max(), std::ios::hex | std::ios::internal | std::ios::uppercase | std::ios::showpos, 10, '_', "FFFFFFFFFFFFFFFF"},
{std::numeric_limits<uint64_t>::max(), std::ios::hex | std::ios::internal | std::ios::uppercase | std::ios::showbase, 0, '_', "0XFFFFFFFFFFFFFFFF"},
{std::numeric_limits<uint64_t>::max(), std::ios::hex | std::ios::internal | std::ios::uppercase | std::ios::showbase, 10, '_', "0XFFFFFFFFFFFFFFFF"},
{std::numeric_limits<uint64_t>::max(), std::ios::hex | std::ios::internal | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 0, '_', "0XFFFFFFFFFFFFFFFF"},
{std::numeric_limits<uint64_t>::max(), std::ios::hex | std::ios::internal | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 10, '_', "0XFFFFFFFFFFFFFFFF"},
{std::numeric_limits<uint64_t>::max(), std::ios::hex | std::ios::right, 0, '_', "ffffffffffffffff"},
{std::numeric_limits<uint64_t>::max(), std::ios::hex | std::ios::right, 10, '_', "ffffffffffffffff"},
{std::numeric_limits<uint64_t>::max(), std::ios::hex | std::ios::right | std::ios::showpos, 0, '_', "ffffffffffffffff"},
{std::numeric_limits<uint64_t>::max(), std::ios::hex | std::ios::right | std::ios::showpos, 10, '_', "ffffffffffffffff"},
{std::numeric_limits<uint64_t>::max(), std::ios::hex | std::ios::right | std::ios::showbase, 0, '_', "0xffffffffffffffff"},
{std::numeric_limits<uint64_t>::max(), std::ios::hex | std::ios::right | std::ios::showbase, 10, '_', "0xffffffffffffffff"},
{std::numeric_limits<uint64_t>::max(), std::ios::hex | std::ios::right | std::ios::showbase | std::ios::showpos, 0, '_', "0xffffffffffffffff"},
{std::numeric_limits<uint64_t>::max(), std::ios::hex | std::ios::right | std::ios::showbase | std::ios::showpos, 10, '_', "0xffffffffffffffff"},
{std::numeric_limits<uint64_t>::max(), std::ios::hex | std::ios::right | std::ios::uppercase, 0, '_', "FFFFFFFFFFFFFFFF"},
{std::numeric_limits<uint64_t>::max(), std::ios::hex | std::ios::right | std::ios::uppercase, 10, '_', "FFFFFFFFFFFFFFFF"},
{std::numeric_limits<uint64_t>::max(), std::ios::hex | std::ios::right | std::ios::uppercase | std::ios::showpos, 0, '_', "FFFFFFFFFFFFFFFF"},
{std::numeric_limits<uint64_t>::max(), std::ios::hex | std::ios::right | std::ios::uppercase | std::ios::showpos, 10, '_', "FFFFFFFFFFFFFFFF"},
{std::numeric_limits<uint64_t>::max(), std::ios::hex | std::ios::right | std::ios::uppercase | std::ios::showbase, 0, '_', "0XFFFFFFFFFFFFFFFF"},
{std::numeric_limits<uint64_t>::max(), std::ios::hex | std::ios::right | std::ios::uppercase | std::ios::showbase, 10, '_', "0XFFFFFFFFFFFFFFFF"},
{std::numeric_limits<uint64_t>::max(), std::ios::hex | std::ios::right | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 0, '_', "0XFFFFFFFFFFFFFFFF"},
{std::numeric_limits<uint64_t>::max(), std::ios::hex | std::ios::right | std::ios::uppercase | std::ios::showbase | std::ios::showpos, 10, '_', "0XFFFFFFFFFFFFFFFF"},

View file

@ -212,7 +212,7 @@ DereferenceFormatter() {
// std::make_pair("a", 1), // std::make_pair("a", 1),
// std::make_pair("b", 2), // std::make_pair("b", 2),
// std::make_pair("c", 3)}; // std::make_pair("c", 3)};
// std::string s = absl::StrJoin(m, ",", strings::PairFormatter("=")); // std::string s = absl::StrJoin(m, ",", absl::PairFormatter("="));
// EXPECT_EQ("a=1,b=2,c=3", s); // EXPECT_EQ("a=1,b=2,c=3", s);
// //
// Example 7: // Example 7:

View file

@ -857,12 +857,10 @@ TEST(Delimiter, ByLength) {
EXPECT_FALSE(IsFoundAt("abcd", four_char_delim, 0)); EXPECT_FALSE(IsFoundAt("abcd", four_char_delim, 0));
} }
// Allocates too much memory for TSan and MSan.
#if !defined(THREAD_SANITIZER) && !defined(MEMORY_SANITIZER)
TEST(Split, WorksWithLargeStrings) { TEST(Split, WorksWithLargeStrings) {
if (sizeof(size_t) > 4 && !RunningOnValgrind()) { if (sizeof(size_t) > 4) {
std::string s(1ULL << 31, 'x'); std::string s((uint32_t{1} << 31) + 1, 'x'); // 2G + 1 byte
s.push_back('-'); // 2G + 1 byte s.back() = '-';
std::vector<absl::string_view> v = absl::StrSplit(s, '-'); std::vector<absl::string_view> v = absl::StrSplit(s, '-');
EXPECT_EQ(2, v.size()); EXPECT_EQ(2, v.size());
// The first element will contain 2G of 'x's. // The first element will contain 2G of 'x's.
@ -873,7 +871,6 @@ TEST(Split, WorksWithLargeStrings) {
EXPECT_EQ("", v[1]); EXPECT_EQ("", v[1]);
} }
} }
#endif // THREAD_SANITIZER
TEST(SplitInternalTest, TypeTraits) { TEST(SplitInternalTest, TypeTraits) {
EXPECT_FALSE(absl::strings_internal::HasMappedType<int>::value); EXPECT_FALSE(absl::strings_internal::HasMappedType<int>::value);

View file

@ -190,3 +190,19 @@ cc_test(
"@com_google_googletest//:gtest_main", "@com_google_googletest//:gtest_main",
], ],
) )
cc_test(
name = "lifetime_test",
srcs = [
"lifetime_test.cc",
],
copts = ABSL_TEST_COPTS,
linkopts = select({
"//absl:windows": [],
"//conditions:default": ["-pthread"],
}),
deps = [
":synchronization",
"//absl/base",
],
)

View file

@ -0,0 +1,95 @@
// Copyright 2017 The Abseil Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include <cstdlib>
#include <thread> // NOLINT(build/c++11), Abseil test
#include <type_traits>
#include "absl/base/attributes.h"
#include "absl/base/internal/raw_logging.h"
#include "absl/synchronization/mutex.h"
#include "absl/synchronization/notification.h"
namespace {
// A two-threaded test which checks that Mutex, CondVar, and Notification have
// correct basic functionality. The intent is to establish that they
// function correctly in various phases of construction and destruction.
//
// Thread one acquires a lock on 'mutex', wakes thread two via 'notification',
// then waits for 'state' to be set, as signalled by 'condvar'.
//
// Thread two waits on 'notification', then sets 'state' inside the 'mutex',
// signalling the change via 'condvar'.
//
// These tests use ABSL_RAW_CHECK to validate invariants, rather than EXPECT or
// ASSERT from gUnit, because we need to invoke them during global destructors,
// when gUnit teardown would have already begun.
void ThreadOne(absl::Mutex* mutex, absl::CondVar* condvar,
absl::Notification* notification, bool* state) {
// Test that the notification is in a valid initial state.
ABSL_RAW_CHECK(!notification->HasBeenNotified(), "invalid Notification");
ABSL_RAW_CHECK(*state == false, "*state not initialized");
{
absl::MutexLock lock(mutex);
notification->Notify();
ABSL_RAW_CHECK(notification->HasBeenNotified(), "invalid Notification");
while (*state == false) {
condvar->Wait(mutex);
}
}
}
void ThreadTwo(absl::Mutex* mutex, absl::CondVar* condvar,
absl::Notification* notification, bool* state) {
ABSL_RAW_CHECK(*state == false, "*state not initialized");
// Wake thread one
notification->WaitForNotification();
ABSL_RAW_CHECK(notification->HasBeenNotified(), "invalid Notification");
{
absl::MutexLock lock(mutex);
*state = true;
condvar->Signal();
}
}
// Launch thread 1 and thread 2, and block on their completion.
void RunTests(absl::Mutex* mutex, absl::CondVar* condvar,
absl::Notification* notification) {
bool state = false;
std::thread thread_one(ThreadOne, mutex, condvar, notification, &state);
std::thread thread_two(ThreadTwo, mutex, condvar, notification, &state);
thread_one.join();
thread_two.join();
}
void TestLocals() {
absl::Mutex mutex;
absl::CondVar condvar;
absl::Notification notification;
RunTests(&mutex, &condvar, &notification);
}
} // namespace
int main() {
TestLocals();
// Explicitly call exit(0) here, to make it clear that we intend for the
// above global object destructors to run.
std::exit(0);
}