Advertisement
Swiftkill

enable_if

Feb 11th, 2019
207
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.15 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4.  
  5. namespace std11 {
  6.    
  7. template< class T > struct remove_const          { typedef T type; };
  8. template< class T > struct remove_const<const T> { typedef T type; };
  9.  
  10. template< class T > struct remove_volatile             { typedef T type; };
  11. template< class T > struct remove_volatile<volatile T> { typedef T type; };
  12.    
  13. template< class T >
  14. struct remove_cv {
  15.     typedef typename std11::remove_volatile<typename std11::remove_const<T>::type>::type type;
  16. };    
  17.    
  18. template<class T, T v>
  19. struct integral_constant {
  20.     static const T value = v;
  21.     typedef T value_type;
  22.     typedef integral_constant type;
  23.     operator value_type() const  { return value; }
  24.     const value_type operator()() const  { return value; }
  25. };
  26.    
  27.     typedef integral_constant<bool, true> true_type;
  28.     typedef integral_constant<bool, false> false_type;
  29.    
  30.     template<bool B, class T = void>
  31.     struct enable_if {};
  32.  
  33.     template<class T>
  34.     struct enable_if<true, T> { typedef T type; };
  35.    
  36.     template< class T > struct is_pointer_helper     : false_type {};
  37.     template< class T > struct is_pointer_helper<T*> : true_type {};
  38.     template< class T > struct is_pointer : is_pointer_helper<typename std11::remove_cv<T>::type> {};
  39.  
  40.    
  41.     template <typename T>
  42.     typename T::iterator begin(T &c) {
  43.         return c.begin();
  44.     }
  45.  
  46.     template <typename T>
  47.     const typename T::const_iterator begin(const T &c) {
  48.         return c.begin();
  49.     }
  50.  
  51.     template <typename T>
  52.     typename T::iterator end(T &c) {
  53.         return c.end();
  54.     }
  55.  
  56.     template <typename T>
  57.     const typename T::const_iterator end(const T &c) {
  58.         return c.end();
  59.     }
  60.  
  61.     template <typename T, size_t size>
  62.     T* begin(T(&c)[size]) {
  63.         return &c[0];
  64.     }
  65.  
  66.     template <typename T, size_t size>
  67.     const T* begin(const T(&c)[size]) {
  68.         return &c[0];
  69.     }
  70.  
  71.     template <typename T, size_t size>
  72.     const T* end(const T(&c)[size]) {
  73.         return &c[0] + size;
  74.     }
  75.  
  76.     template <typename T, size_t size>
  77.     T* end(T(&c)[size]) {
  78.         return &c[0] + size;
  79.     }
  80. } // std11
  81.  
  82. // #ifdef keeps us safe from UB
  83.  
  84. namespace std {
  85. #if !(__cplusplus > 1)
  86.     using std11::true_type;
  87.     using std11::false_type;
  88.     using std11::is_pointer;
  89.     using std11::integral_constant;
  90.     using std11::enable_if;
  91. #endif
  92. #if (__cplusplus < 199711L) && !defined(_MSC_VER)
  93.     using std11::begin;
  94.     using std11::end;
  95. #endif
  96. }
  97.  
  98.  
  99. template <class S, class D>
  100. typename D::iterator copy_all(const S& src, D& dst, typename D::iterator* =0)
  101. {
  102.     return std::copy( std::begin(src), std::end(src), std::begin(dst));
  103. }
  104.  
  105. template <class S, class OutIt>
  106. OutIt copy_all(const S& src, OutIt dstIt, typename OutIt::iterator_category* = 0 )
  107. {
  108.     return std::copy( std::begin(src), std::end(src), dstIt);
  109. }
  110.  
  111. // unsafe
  112. template <class S, class D, size_t SN, size_t TN>
  113. D* copy_all(S (&src)[SN], D (&dst)[TN])
  114. {
  115.     return std::copy( std::begin(src), std::end(src), std::begin(dst));
  116. }
  117.  
  118. template <class S, class OutIt, size_t SN>
  119. OutIt copy_all(S (&src)[SN], OutIt dstIt, typename std::enable_if<std::is_pointer<OutIt>::value>::type* = 0)
  120. {
  121.     std::cerr << __PRETTY_FUNCTION__<<":" << __LINE__<< "\n" << std::begin(src) << "," << std::end(src) << std::endl;
  122.     return std::copy( std::begin(src), std::end(src), dstIt);
  123. }
  124.  
  125. template <class S, class D, size_t SN>
  126. typename D::iterator
  127. copy_all(S (&src)[SN], D& dst ) {
  128.     std::cerr << __PRETTY_FUNCTION__<<":" << __LINE__<< "\n" << std::begin(src) << "," << std::end(src) << std::endl;
  129.     return std::copy( std::begin(src), std::end(src), std::begin(dst));
  130. }
  131.  
  132. /**
  133.   printv
  134. */
  135. template <class V>
  136. void printv ( std::string name, V va) {
  137.     std::cout << name << " = { ";
  138.     for (typename V::const_iterator i = std::begin(va), endv = std::end(va); i != endv; ++i)
  139.         std::cout << *i << ' ';
  140.     std::cout << "} \n";
  141. }
  142.  
  143. template <class V, size_t len>
  144. void printv ( std::string name, V (&va)[len]) {
  145.     std::cout << name << " = { ";
  146.     for (V* i = std::begin(va), *endv = std::end(va); i != endv; ++i)
  147.         std::cout << *i << ' ';
  148.     std::cout << "} \n";
  149. }
  150.  
  151. template <class OutIt>
  152. void printv ( std::string name, OutIt va, size_t len) {
  153.     std::cout << name << " = { ";
  154.     for (OutIt i = va, endv = va[len]; i != endv; ++i)
  155.         std::cout << *i << ' ';
  156.     std::cout << "} \n";
  157. }
  158.  
  159. int main()
  160. {  
  161.     const int a[4] = {1,2,3,4};
  162.     const int b[4] = {5,6,7,8};
  163.     int c[8];
  164.     std::vector<int> va, vb, vc;
  165.        
  166.     std::cerr << "Array to vector copy" << std::endl;
  167.     va.resize(std::end(a)-std::begin(a));
  168.     copy_all(a,va);
  169.     vb.resize(std::end(b)-std::begin(b));
  170.     copy_all(b,vb);
  171.    
  172.     vc.resize(va.size()+vb.size());
  173.     copy_all (vb, copy_all(va,vc));
  174.     //std::vector<int>::iterator vci = copy_all(va,vc);
  175.     //copy_all (vb, vci);
  176.    
  177.     printv("va", va);
  178.     printv("vb", vb);
  179.     printv("vc", vc);
  180.    
  181.     std::cerr << "Array copy" << std::endl;
  182.     copy_all(b,
  183.              copy_all(a,c));
  184.    
  185.     printv("a", a);
  186.     printv("b", b);
  187.     printv("c", c);
  188. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement