2018-05-10 14:11:00 +00:00
|
|
|
// 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.
|
|
|
|
|
|
|
|
#include "fmt/ranges.h"
|
|
|
|
|
|
|
|
#include "gtest/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);
|
|
|
|
}
|
|
|
|
|
2018-05-20 16:09:03 +00:00
|
|
|
#if FMT_USE_INTEGER_SEQUENCE
|
2018-05-10 14:11:00 +00:00
|
|
|
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> tu1{42, 3.14159265358979f,
|
|
|
|
"this is tuple"};
|
|
|
|
EXPECT_EQ("(42, 3.14159, this is tuple)", fmt::format("{}", tu1));
|
|
|
|
}
|
|
|
|
|
2018-05-20 16:09:03 +00:00
|
|
|
/// Check if 'if constexpr' is supported.
|
2018-05-10 14:11:00 +00:00
|
|
|
#if (__cplusplus > 201402L) || \
|
|
|
|
(defined(_MSVC_LANG) && _MSVC_LANG > 201402L && _MSC_VER >= 1910)
|
|
|
|
|
|
|
|
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)
|
2018-05-20 16:09:03 +00:00
|
|
|
#endif // FMT_USE_INTEGER_SEQUENCE
|