mirror of
				https://github.com/fmtlib/fmt.git
				synced 2025-11-04 08:01:40 +01:00 
			
		
		
		
	
		
			
	
	
		
			89 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			89 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| 
								 | 
							
								// 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);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								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));
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/// check if  'if constexpr' is supported.
							 | 
						||
| 
								 | 
							
								#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)
							 |