| // Formatting library for C++ - the core API |
| // |
| // Copyright (c) 2012 - present, Victor Zverovich |
| // All rights reserved. |
| // |
| // For the license information refer to format.h. |
| // |
| // Copyright (c) 2018 - present, Remotion (Igor Schulz) |
| // All Rights Reserved |
| // {fmt} support for ranges, containers and types tuple interface. |
| |
| /// Check if 'if constexpr' is supported. |
| #if (__cplusplus > 201402L) || \ |
| (defined(_MSVC_LANG) && _MSVC_LANG > 201402L && _MSC_VER >= 1910) |
| |
| #include "fmt/ranges.h" |
| #include "gtest.h" |
| |
| #include <vector> |
| #include <array> |
| #include <map> |
| #include <string> |
| |
| TEST(RangesTest, FormatVector) { |
| std::vector<int32_t> iv{1, 2, 3, 5, 7, 11}; |
| auto ivf = fmt::format("{}", iv); |
| EXPECT_EQ("{1, 2, 3, 5, 7, 11}", ivf); |
| } |
| |
| TEST(RangesTest, FormatVector2) { |
| std::vector<std::vector<int32_t>> ivv{{1, 2}, {3, 5}, {7, 11}}; |
| auto ivf = fmt::format("{}", ivv); |
| EXPECT_EQ("{{1, 2}, {3, 5}, {7, 11}}", ivf); |
| } |
| |
| TEST(RangesTest, FormatMap) { |
| std::map<std::string, int32_t> simap{{"one", 1}, {"two", 2}}; |
| EXPECT_EQ("{(\"one\", 1), (\"two\", 2)}", fmt::format("{}", simap)); |
| } |
| |
| TEST(RangesTest, FormatPair) { |
| std::pair<int64_t, float> pa1{42, 3.14159265358979f}; |
| EXPECT_EQ("(42, 3.14159)", fmt::format("{}", pa1)); |
| } |
| |
| TEST(RangesTest, FormatTuple) { |
| std::tuple<int64_t, float, std::string, char> tu1{42, 3.14159265358979f, |
| "this is tuple", 'i'}; |
| EXPECT_EQ("(42, 3.14159, \"this is tuple\", 'i')", fmt::format("{}", tu1)); |
| } |
| |
| struct my_struct { |
| int32_t i; |
| std::string str; // can throw |
| template <std::size_t N> |
| decltype(auto) get() const noexcept { |
| if constexpr (N == 0) |
| return i; |
| else if constexpr (N == 1) |
| return fmt::string_view{str}; |
| } |
| }; |
| |
| template <std::size_t N> |
| decltype(auto) get(const my_struct& s) noexcept { |
| return s.get<N>(); |
| } |
| |
| namespace std { |
| |
| template <> |
| struct tuple_size<my_struct> : std::integral_constant<std::size_t, 2> {}; |
| |
| template <std::size_t N> |
| struct tuple_element<N, my_struct> { |
| using type = decltype(std::declval<my_struct>().get<N>()); |
| }; |
| |
| } // namespace std |
| |
| TEST(RangesTest, FormatStruct) { |
| my_struct mst{13, "my struct"}; |
| EXPECT_EQ("(13, \"my struct\")", fmt::format("{}", mst)); |
| } |
| |
| #endif // (__cplusplus > 201402L) || (defined(_MSVC_LANG) && _MSVC_LANG > |
| // 201402L && _MSC_VER >= 1910) |