stl_io_helper.hpp Source File

LibRPA: stl_io_helper.hpp Source File
LibRPA
stl_io_helper.hpp
1 #pragma once
2 #include <array>
3 #include <map>
4 #include <ostream>
5 #include <set>
6 #include <vector>
7 #include <utility>
8 
10 template <typename T>
11 std::ostream& operator<<(std::ostream& os, const std::set<T> &set_objs)
12 {
13  os << "[";
14  if (!set_objs.empty())
15  {
16  auto pobj = set_objs.cbegin();
17  for (; pobj != std::prev(set_objs.cend()); pobj++)
18  os << *pobj << ",";
19  os << *pobj;
20  }
21  os << "](s" << set_objs.size() << ")";
22  return os;
23 }
24 
26 template <typename T>
27 std::ostream& operator<<(std::ostream& os, const std::vector<T> &vector_objs)
28 {
29  os << "[";
30  if (!vector_objs.empty())
31  {
32  auto pobj = vector_objs.cbegin();
33  for (; pobj != std::prev(vector_objs.cend()); pobj++)
34  os << *pobj << ",";
35  os << *pobj;
36  }
37  os << "](v" << vector_objs.size() << ")";
38  return os;
39 }
40 
42 template <typename T1, typename T2>
43 std::ostream& operator<<(std::ostream& os, const std::pair<T1, T2> &pair_objs)
44 {
45  os << "{" << pair_objs.first << "," << pair_objs.second << "}";
46  return os;
47 }
48 
50 template <typename T, size_t N>
51 std::ostream& operator<<(std::ostream& os, const std::array<T, N> &arr_objs)
52 {
53  os << "[";
54  for (int i = 0; i < N - 1; i++)
55  os << arr_objs[i] << ",";
56  os << arr_objs[N-1] << "](a" << N << ")";
57  return os;
58 }
59 
61 template <typename Tkey, typename Tval>
62 std::ostream& operator<<(std::ostream& os, const std::map<Tkey, Tval> &map_objs)
63 {
64  os << "{";
65  for (const auto& kv: map_objs)
66  {
67  os << "\"" << kv.first << "\":\"" << kv.second << "\"\n";
68  }
69  os << "}";
70  return os;
71 }
72 
74 template <typename Tkey1, typename Tkey2, typename Tval>
75 void print_keys(std::ostream& os, const std::map<Tkey1, std::map<Tkey2, Tval>> &nested_map)
76 {
77  for (const auto& k1k2v: nested_map)
78  for (const auto& k2v: k1k2v.second)
79  os << k1k2v.first << " " << k2v.first << "\n";
80 }
81 
83 template <typename Tkey1, typename Tkey2, typename Tkey3, typename Tval>
84 void print_keys(std::ostream& os, const std::map<Tkey1, std::map<Tkey2, std::map<Tkey3, Tval>>> &nested_map)
85 {
86  for (const auto& k1k2k3v: nested_map)
87  for (const auto& k2k3v: k1k2k3v.second)
88  for (const auto& k3v: k2k3v.second)
89  os << k1k2k3v.first << " " << k2k3v.first << " " << k3v.first << "\n";
90 }
91 
93 template <typename Tkey1, typename Tkey2, typename Tval>
94 int get_num_keys(const std::map<Tkey1, std::map<Tkey2, Tval>> &nested_map)
95 {
96  int nkeys = 0;
97  for (const auto& k1k2v: nested_map)
98  for (const auto& k2v: k1k2v.second)
99  nkeys++;
100  return nkeys;
101 }
102 
104 template <typename Tkey1, typename Tkey2, typename Tkey3, typename Tval>
105 int get_num_keys(const std::map<Tkey1, std::map<Tkey2, std::map<Tkey3, Tval>>> &nested_map)
106 {
107  int nkeys = 0;
108  for (const auto& k1k2k3v: nested_map)
109  for (const auto& k2k3v: k1k2k3v.second)
110  for (const auto& k3v: k2k3v.second)
111  nkeys++;
112  return nkeys;
113 }