gt22

Untitled

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