Home work №3 "C++ Developer. Professional" OTUS  0.0.1
print_ip.h
Go to the documentation of this file.
1 
13 #ifndef PRINT_IP_H
14 #define PRINT_IP_H
15 
16 #define _PRETTY_ __PRETTY_FUNCTION__
17 #if (defined NDEBUG)
18 #define DEBUG_MODE(x)
19 #else
20 #define DEBUG_MODE(x) (x)
21 #endif
22 
23 #include <list>
24 #include <iostream>
25 #include <string>
26 #include <vector>
27 #include <tuple>
28 #include <type_traits>
29 #include <experimental/iterator>
30 
31 namespace tmp_ {
32 
33  template<typename T>
34  using enable_integral_t = std::enable_if_t<std::is_integral_v<T> && !std::is_same_v<T, bool>>;
35 
36 
37  template<typename T, template<typename> class Cont>
38  using enable_containers_t = std::enable_if_t<std::is_same_v<std::decay_t<Cont<T>>, std::vector<T>>
39  || std::is_same_v<std::decay_t<Cont<T>>, std::list<T>>>;
40 
41 
42  template<typename T>
43  using enable_string_t = std::enable_if_t<std::is_same_v<std::decay_t<T>, std::string>>;
44 
45 
46  template<typename T, typename... Tail>
47  using enable_all_the_same_t = std::enable_if_t<std::conjunction_v<std::is_same<T, Tail>...>>;
48 
49 
50  template<typename T, class = enable_integral_t<T>>
52 
53  public:
54  Integral_type_printer(const T& in_param) : value(in_param){}
55 
56  friend std::ostream& operator<<(std::ostream &cur_stream, const Integral_type_printer& in_param) {
57 
58  for(size_t index = in_param.type_size; index; index--)
59  cur_stream << +in_param.byte_represent[index] << '.';
60 
61  return cur_stream << +in_param.byte_represent[0];
62  }
63 
64  private:
65  union {
66  uint8_t byte_represent[sizeof(T)];
67  T value;
68  };
69  static constexpr size_t type_size = sizeof(T) - 1;
70  };
71 
72 
73  template <typename T, typename ... Ts>
74  void print_args(std::ostream &cur_stream, const T& first_arg, const Ts& ...tail_args) {
75 
76  cur_stream << first_arg;
77  (void)std::initializer_list<int>{((cur_stream << '.' << tail_args), 0)...};
78 
79  }
80 
81 
82  template <typename ... Ts>
83  std::ostream& operator<<(std::ostream &cur_stream, const std::tuple<Ts...>& in_parameter) {
84 
85  auto print_to_stream = [&cur_stream](const auto&... lyambda_args) {
86  print_args(cur_stream, lyambda_args...);
87  };
88 
89  std::apply(print_to_stream, in_parameter);
90 
91  return cur_stream;
92  }
93 
94 
95 } //namespace tmp_
96 
97 
105 template<typename T>
107  generator_ip(const T& param_) {
108 
109  DEBUG_MODE(std::cout << _PRETTY_ << std::endl);
110 
111  std::cout << param_ << std::endl;
112 }
113 
114 
123 template<typename T>
125  generator_ip(const T& in_param) {
126 
127  DEBUG_MODE(std::cout << _PRETTY_ << std::endl);
128 
129  using namespace tmp_;
130 
131  std::cout << Integral_type_printer(in_param) << std::endl;
132 }
133 
142 template<typename T, template<typename> class Cont>
144  generator_ip(const Cont<T>& param_) {
145 
146  DEBUG_MODE(std::cout << _PRETTY_ << std::endl);
147 
148  std::copy(std::begin(param_), std::end(param_), std::experimental::make_ostream_joiner(std::cout, "."));
149  std::cout << std::endl;
150 }
151 
152 
160 template<typename T, typename... Tail>
161 typename tmp_::enable_all_the_same_t<T, Tail...>
162  generator_ip(const std::tuple<T, Tail...>& in_param) {
163 
164  DEBUG_MODE(std::cout << _PRETTY_ << std::endl);
165 
166  using namespace tmp_;
167 
168  std::cout << in_param << std::endl;
169 }
170 
171 
172 
173 #endif // PRINT_IP_H
tmp_::enable_integral_t
std::enable_if_t< std::is_integral_v< T > &&!std::is_same_v< T, bool > > enable_integral_t
Definition: print_ip.h:34
tmp_::enable_all_the_same_t
std::enable_if_t< std::conjunction_v< std::is_same< T, Tail >... > > enable_all_the_same_t
Definition: print_ip.h:47
generator_ip
tmp_::enable_string_t< T > generator_ip(const T &param_)
Printing some IP address implementation for a std::string.
Definition: print_ip.h:107
DEBUG_MODE
#define DEBUG_MODE(x)
Definition: print_ip.h:20
tmp_::enable_containers_t
std::enable_if_t< std::is_same_v< std::decay_t< Cont< T > >, std::vector< T > >||std::is_same_v< std::decay_t< Cont< T > >, std::list< T > >> enable_containers_t
Definition: print_ip.h:39
_PRETTY_
#define _PRETTY_
Definition: print_ip.h:16
tmp_::Integral_type_printer::value
T value
Definition: print_ip.h:67
tmp_::Integral_type_printer::operator<<
friend std::ostream & operator<<(std::ostream &cur_stream, const Integral_type_printer &in_param)
Definition: print_ip.h:56
tmp_::Integral_type_printer::byte_represent
uint8_t byte_represent[sizeof(T)]
Definition: print_ip.h:66
tmp_::Integral_type_printer::Integral_type_printer
Integral_type_printer(const T &in_param)
Definition: print_ip.h:54
tmp_::print_args
void print_args(std::ostream &cur_stream, const T &first_arg, const Ts &...tail_args)
Definition: print_ip.h:74
tmp_::Integral_type_printer::type_size
static constexpr size_t type_size
Definition: print_ip.h:69
tmp_::operator<<
std::ostream & operator<<(std::ostream &cur_stream, const std::tuple< Ts... > &in_parameter)
Definition: print_ip.h:83
tmp_::enable_string_t
std::enable_if_t< std::is_same_v< std::decay_t< T >, std::string > > enable_string_t
Definition: print_ip.h:43
tmp_::Integral_type_printer
Definition: print_ip.h:51
tmp_
Definition: print_ip.h:31