diff options
author | Bjørn Christian Seime <bjorncs@yahoo-inc.com> | 2016-11-22 15:10:51 +0100 |
---|---|---|
committer | Bjørn Christian Seime <bjorncs@yahoo-inc.com> | 2016-11-22 15:10:51 +0100 |
commit | a95e98a1f880be49f9ffcda01468b145b42e8b83 (patch) | |
tree | da140e666ebe14f665d759ecf7a8d535805fc327 /vespalib/src | |
parent | 973bcbf9177d3ad979d56fbbe0e54ab8dcc54817 (diff) |
Add asciistream::StateSaver and use it in BucketSpace/BucketId
Diffstat (limited to 'vespalib/src')
-rw-r--r-- | vespalib/src/tests/stllike/asciistream_test.cpp | 17 | ||||
-rw-r--r-- | vespalib/src/vespa/vespalib/stllike/asciistream.h | 35 |
2 files changed, 52 insertions, 0 deletions
diff --git a/vespalib/src/tests/stllike/asciistream_test.cpp b/vespalib/src/tests/stllike/asciistream_test.cpp index b3a55f4d134..78c81f9d578 100644 --- a/vespalib/src/tests/stllike/asciistream_test.cpp +++ b/vespalib/src/tests/stllike/asciistream_test.cpp @@ -28,6 +28,7 @@ public: void testCopyConstruct(); void testIllegalNumbers(); void testDouble(); + void testStateSaver(); }; template <typename T> @@ -466,6 +467,21 @@ AsciistreamTest::testDouble() { VERIFY_DOUBLE_SERIALIZATION(maxInteger, "9007199254740992.0", automatic << forcedot, 16); } +void +AsciistreamTest::testStateSaver() +{ + asciistream as; + as << vespalib::hex << vespalib::setfill('0'); + { + asciistream::StateSaver stateSaver(as); + as << vespalib::dec << vespalib::setfill('1'); + EXPECT_EQUAL(vespalib::dec, as.getBase()); + EXPECT_EQUAL('1', as.getFill()); + } + ASSERT_EQUAL(vespalib::hex, as.getBase()); + ASSERT_EQUAL('0', as.getFill()); +} + int AsciistreamTest::Main() { @@ -512,6 +528,7 @@ AsciistreamTest::Main() testGetLine(); testIllegalNumbers(); testDouble(); + testStateSaver(); TEST_DONE(); } diff --git a/vespalib/src/vespa/vespalib/stllike/asciistream.h b/vespalib/src/vespa/vespalib/stllike/asciistream.h index 6d2f0c37d31..4c414cc314f 100644 --- a/vespalib/src/vespa/vespalib/stllike/asciistream.h +++ b/vespalib/src/vespa/vespalib/stllike/asciistream.h @@ -101,6 +101,41 @@ public: private: uint32_t _precision; }; + class StateSaver { + public: + // Don't generate move/copy constructors as this class is only intended to + // live on a single stack frame + StateSaver(StateSaver&&) = delete; + StateSaver& operator=(StateSaver&&) = delete; + StateSaver(const StateSaver&) = delete; + StateSaver& operator=(const StateSaver&) = delete; + + explicit StateSaver(asciistream& as) noexcept : + _as(as), + _base(as._base), + _floatSpec(as._floatSpec), + _floatModifier(as._floatModifier), + _width(as._width), + _fill(as._fill), + _precision(as._precision) {} + ~StateSaver() noexcept { + _as._base = _base; + _as._floatSpec = _floatSpec; + _as._floatModifier = _floatModifier; + _as._width = _width; + _as._fill = _fill; + _as._precision = _precision; + } + private: + asciistream& _as; + Base _base; + FloatSpec _floatSpec; + FloatModifier _floatModifier; + uint32_t _width; + char _fill; + uint8_t _precision; + }; + asciistream & operator << (Width v) { _width = v.getWidth(); return *this; } asciistream & operator >> (Width v) { _width = v.getWidth(); return *this; } asciistream & operator << (Fill v) { _fill = v.getFill(); return *this; } |