Advertisement
Tainel

src/base/features/output.hpp

May 25th, 2023 (edited)
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.07 KB | Source Code | 0 0
  1. #pragma once
  2.  
  3. #include"base/dependencies/index.hpp"
  4.  
  5. #include"attributes.hpp"
  6. #include"characters.hpp"
  7. #include"containers.hpp"
  8. #include"integers.hpp"
  9. #include"shortcuts.hpp"
  10.  
  11. // Write the given arguments in order to the given output stream.
  12. template<class...Types>
  13. ostream&write(ostream&os,Types const&...args){return(os<<...<<args);}
  14.  
  15. // Pair output overload.
  16. template<class Fst,class Snd>
  17. ostream&operator<<(ostream&os,pair<Fst,Snd>const&p){
  18.     return os<<p.first<<sp<<p.second;
  19. }
  20.  
  21. // Tuple output overload.
  22. template<class...Types>ostream&operator<<(ostream&os,tuple<Types...>const&t){
  23.     apply([&os](Types const&...args){
  24.         size_t rem=sizeof...(Types);
  25.         ((os<<args<<(--rem?" ":"")),...);
  26.     },t);
  27.     return os;
  28. }
  29.  
  30. // Printable wrapper for generic containers.
  31. template<class Container,char Sep>struct printable{
  32.     // Wrap the container in a printable structure.
  33.     printable(Container const&_c):c(_c){}
  34.     // Container wrapper output overload.
  35.     friend ostream&operator<<(ostream&os,printable const&w){
  36.         s32 rem=SIZE(w.c);
  37.         FORE(e,w.c){
  38.             os<<e;
  39.             if(--rem)LIKELY{os<<Sep;}
  40.         }
  41.         return os;
  42.     }
  43. private:
  44.     // Wrapped container.
  45.     Container const&c;
  46. };
  47.  
  48. // Horizontal printable wrapper for containers.
  49. template<class Container>
  50. printable<Container,sp>horizontal(Container const&c){return c;}
  51.  
  52. // Vertical printable wrapper for containers.
  53. template<class Container>
  54. printable<Container,lf>vertical(Container const&c){return c;}
  55.  
  56. // Array output overload.
  57. template<class Type,size_t Size>
  58. ostream&operator<<(ostream&os,array<Type,Size>const&a){
  59.     return os<<horizontal(a);
  60. }
  61.  
  62. // Valarray output overload.
  63. template<class Type>ostream&operator<<(ostream&os,valarray<Type>const&va){
  64.     return os<<horizontal(va);
  65. }
  66.  
  67. // Vector output overload.
  68. template<class Type>
  69. ostream&operator<<(ostream&os,vector<Type>const&v){return os<<horizontal(v);}
  70.  
  71. // Deque output overload.
  72. template<class Type>
  73. ostream&operator<<(ostream&os,deque<Type>const&d){return os<<horizontal(d);}
  74.  
  75. // Set output overload.
  76. template<class Key,class Comp>
  77. ostream&operator<<(ostream&os,set<Key,Comp>const&s){return os<<horizontal(s);}
  78.  
  79. // Unordered set output overload.
  80. template<class Key,class Hash>
  81. ostream&operator<<(ostream&os,uset<Key,Hash>const&us){
  82.     return os<<horizontal(us);
  83. }
  84.  
  85. // Map output overload.
  86. template<class Key,class Val,class Comp>
  87. ostream&operator<<(ostream&os,map<Key,Val,Comp>const&m){
  88.     return os<<vertical(m);
  89. }
  90.  
  91. // Unordered map output overload.
  92. template<class Key,class Val,class Hash>
  93. ostream&operator<<(ostream&os,umap<Key,Val,Hash>const&um){
  94.     return os<<vertical(um);
  95. }
  96.  
  97. // Indexable red-black tree output overload.
  98. template<class Key,class Val,class Comp>
  99. ostream&operator<<(ostream&os,rbtree<Key,Val,Comp>const&rb){
  100.     if constexpr(is_same_v<Val,PBDS::null_type>){return os<<horizontal(rb);}
  101.     return os<<vertical(rb);
  102. }
  103.  
  104. // Hash table output overload.
  105. template<class Key,class Val,class Hash>
  106. ostream&operator<<(ostream&os,htable<Key,Val,Hash>const&ht){
  107.     if constexpr(is_same_v<Val,PBDS::null_type>){return os<<horizontal(ht);}
  108.     return os<<vertical(ht);
  109. }
  110.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement