From fa5ebd27d40348f019a58cc9035d7d6bf68b8ccf Mon Sep 17 00:00:00 2001 From: Victor Zverovich Date: Mon, 25 Apr 2016 08:07:27 -0700 Subject: [PATCH] Implement time formatting --- fmt/CMakeLists.txt | 2 +- fmt/format.h | 2 ++ fmt/time.h | 57 +++++++++++++++++++++++++++++++++++++++++++++ test/format-test.cc | 11 +++++++++ 4 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 fmt/time.h diff --git a/fmt/CMakeLists.txt b/fmt/CMakeLists.txt index 8123edf3..6d9531fd 100644 --- a/fmt/CMakeLists.txt +++ b/fmt/CMakeLists.txt @@ -1,6 +1,6 @@ # Define the fmt library, its includes and the needed defines. # format.cc is added to FMT_HEADERS for the header-only configuration. -set(FMT_HEADERS format.h format.cc) +set(FMT_HEADERS format.h format.cc time.h) if (HAVE_OPEN) set(FMT_HEADERS ${FMT_HEADERS} posix.h) set(FMT_SOURCES ${FMT_SOURCES} posix.cc) diff --git a/fmt/format.h b/fmt/format.h index d5e2e133..a42e29f8 100644 --- a/fmt/format.h +++ b/fmt/format.h @@ -2626,6 +2626,8 @@ class BasicWriter { } void clear() FMT_NOEXCEPT { buffer_.clear(); } + + Buffer &buffer() FMT_NOEXCEPT { return buffer_; } }; template diff --git a/fmt/time.h b/fmt/time.h new file mode 100644 index 00000000..7d815d3e --- /dev/null +++ b/fmt/time.h @@ -0,0 +1,57 @@ +/* + Formatting library for C++ - time formatting + + Copyright (c) 2012 - 2016, Victor Zverovich + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef FMT_TIME_H_ +#define FMT_TIME_H_ + +#include "fmt/format.h" +#include + +namespace fmt { +template +void format(BasicFormatter &f, + const char *&format_str, const std::tm &tm) { + if (*format_str == ':') + ++format_str; + const char *end = format_str; + while (*end && *end != '}') + ++end; + if (*end != '}') + FMT_THROW(FormatError("missing '}' in format string")); + Buffer &buffer = f.writer().buffer(); + std::size_t start = buffer.size(); + internal::MemoryBuffer format; + format.append(format_str, end + 1); + format[format.size() - 1] = '\0'; + std::size_t size = std::strftime(&buffer[start], buffer.capacity() - start, + &format[0], &tm); + buffer.resize(start + size); + format_str = end + 1; +} +} + +#endif // FMT_TIME_H_ diff --git a/test/format-test.cc b/test/format-test.cc index 22b71f3d..80505ba9 100644 --- a/test/format-test.cc +++ b/test/format-test.cc @@ -47,6 +47,8 @@ #define None 0 #include "fmt/format.h" +#include "fmt/time.h" + #include "util.h" #include "mock-allocator.h" #include "gtest-extra.h" @@ -1578,6 +1580,15 @@ TEST(FormatTest, Variadic) { EXPECT_EQ(L"abc1", format(L"{}c{}", L"ab", 1)); } +TEST(FormatTest, Time) { + std::tm tm = std::tm(); + tm.tm_year = 116; + tm.tm_mon = 3; + tm.tm_mday = 25; + EXPECT_EQ("The date is 2016-04-25.", + fmt::format("The date is {:%Y-%m-%d}.", tm)); +} + template std::string str(const T &value) { return fmt::format("{}", value);