Dukales

proxy sort

Aug 11th, 2015
266
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.75 KB | None | 0 0
  1. #include <iostream>
  2. #include <iomanip>
  3.  
  4. #include <type_traits>
  5. #include <utility>
  6. #include <iterator>
  7. #include <algorithm>
  8. #include <deque>
  9. #include <forward_list>
  10.  
  11. #include <cstdlib>
  12. #include <cassert>
  13.  
  14. template< typename iterator >
  15. void
  16. proxy_sort(iterator beg, iterator end)
  17. {
  18.     static_assert(std::is_base_of< std::forward_iterator_tag, typename std::iterator_traits< iterator >::iterator_category >{});
  19.     using reference = typename std::iterator_traits< iterator >::reference;
  20.     using pointer = typename std::iterator_traits< iterator >::pointer;
  21.     struct iterator_adaptor
  22.     { // In `std::swap` makes first and last statement in `T tmp(std::move(lhs)); lhs = std::move(rhs); rhs = std::move(tmp);` a no-op.
  23.        
  24.         iterator_adaptor(reference value)
  25.             : p(&value)
  26.         { ; }
  27.        
  28.         iterator_adaptor(iterator_adaptor &&)
  29.             : p(nullptr)
  30.         { ; }
  31.        
  32.         void
  33.         operator = (iterator_adaptor && rhs) &
  34.         {
  35.             if (!!rhs.p) {
  36.                 std::iter_swap(p, rhs.p);
  37.             }
  38.         }
  39.  
  40.         bool
  41.         operator < (iterator_adaptor const & rhs) const
  42.         {
  43.             return (*p < *rhs.p);
  44.         }
  45.        
  46.     private :
  47.        
  48.         pointer p;
  49.  
  50.     };
  51.     std::deque< iterator_adaptor > proxy_(beg, end);
  52.     std::sort(std::begin(proxy_), std::end(proxy_));
  53. }
  54.  
  55. int
  56. main()
  57. {
  58.     std::forward_list< int > l{5, 4, 3, 2, 1};
  59.     std::copy(std::cbegin(l), std::cend(l), std::ostream_iterator< int >(std::cout, " ")); std::cout << std::endl;
  60.     proxy_sort(std::begin(l), std::end(l));
  61.     std::copy(std::cbegin(l), std::cend(l), std::ostream_iterator< int >(std::cout, " ")); std::cout << std::endl;
  62.     return EXIT_SUCCESS;
  63. }
Advertisement
Add Comment
Please, Sign In to add comment