Advertisement
gt22

Untitled

Jun 5th, 2020
818
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.80 KB | None | 0 0
  1. #ifdef USE_BUFFER_IO
  2. #include "optimization.h"
  3. #else
  4. #include <iostream>
  5. #endif
  6.  
  7. namespace template_io {
  8.  
  9.     namespace meta {
  10.         template<typename ...Ts>
  11.         struct type_list {
  12.         };
  13.  
  14.         template<typename T, size_t N>
  15.         class make_n_list {
  16.             template<typename = std::make_index_sequence<N>>
  17.             struct impl;
  18.  
  19.             template<size_t... Is>
  20.             struct impl<std::index_sequence<Is...>> {
  21.                 template<size_t>
  22.                 using wrap = T;
  23.  
  24.                 using type = type_list<wrap<Is>...>;
  25.             };
  26.  
  27.         public:
  28.             using type = typename impl<>::type;
  29.         };
  30.  
  31.         template<typename T, size_t N>
  32.         using make_n_list_t = typename make_n_list<T, N>::type;
  33.  
  34.         template<typename T, typename...>
  35.         struct head {
  36.             using type = T;
  37.         };
  38.  
  39.         template<typename ...Ts>
  40.         using head_t = typename head<Ts...>::type;
  41.     }
  42.  
  43.     namespace input {
  44.         template<typename T, typename = void>
  45.         struct reader {
  46.         };
  47.  
  48. #ifdef USE_BUFFER_IO
  49.  
  50.         template<typename T>
  51.         struct reader<T, std::enable_if_t<std::is_integral_v<T>>> {
  52.             static auto func() {
  53.                 return readInt<T>();
  54.             }
  55.         };
  56.  
  57.         template<>
  58.         struct reader<double> {
  59.             static auto func() {
  60.                 return readDouble();
  61.             }
  62.         };
  63. #else
  64.         template<typename T>
  65.         struct reader<T, std::enable_if_t<std::is_integral_v<T>>> {
  66.             static auto func() {
  67.                 T x;
  68.                 std::cin >> x;
  69.                 return x;
  70.             }
  71.         };
  72.  
  73.         template<>
  74.         struct reader<double> {
  75.             static auto func() {
  76.                 double x;
  77.                 std::cin >> x;
  78.                 return x;
  79.             }
  80.         };
  81. #endif
  82.  
  83.         template<typename T>
  84.         auto read() {
  85.             return reader<T>::func();
  86.         }
  87.  
  88.         template<typename ...Ts, typename = std::enable_if_t<sizeof...(Ts) >= 2>>
  89.         auto read() {
  90.             return std::tuple{read<Ts>()...};
  91.         }
  92.  
  93.         template<typename ...Ts, typename = std::enable_if_t<sizeof...(Ts) >= 1>>
  94.         auto read(meta::type_list<Ts...>) {
  95.             return read<Ts...>();
  96.         }
  97.  
  98.         template<size_t N, typename T = int>
  99.         auto read() {
  100.             return read(meta::make_n_list_t<T, N>());
  101.         }
  102.  
  103.         struct read_s {
  104.             template<typename T>
  105.             operator T() {
  106.                 return read<T>();
  107.             }
  108.         };
  109.  
  110.         auto read() {
  111.             return read_s();
  112.         }
  113.  
  114.     }
  115.  
  116.     namespace output {
  117.  
  118.         template<typename T, typename = void>
  119.         struct writer {
  120.         };
  121. #ifdef USE_BUFFER_IO
  122.         template<typename T>
  123.         struct writer<T, std::enable_if_t<std::is_integral_v<T>>> {
  124.             static void func(const T& t, char end) {
  125.                 writeInt<T>(t, end);
  126.             }
  127.         };
  128.  
  129.         template<>
  130.         struct writer<double> {
  131.             static auto func(double d, char end) {
  132.                 writeDouble(d);
  133.                 if (end) writeChar(end);
  134.             }
  135.         };
  136. #else
  137.         template<typename T>
  138.         struct writer<T, std::enable_if_t<std::is_integral_v<T>>> {
  139.             static void func(const T& t, char end) {
  140.                 std::cout << t << end;
  141.             }
  142.         };
  143.  
  144.         template<>
  145.         struct writer<double> {
  146.             static auto func(double d, char end) {
  147.                 std::cout << d << end;
  148.             }
  149.         };
  150. #endif
  151.         template<typename T>
  152.         void write(T t, char end = '\0') {
  153.             return writer<T>::func(t, end);
  154.         }
  155.     }
  156.     using input::read, output::write;
  157. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement