Advertisement
Guest User

Untitled

a guest
Oct 27th, 2021
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.13 KB | None | 0 0
  1. enum struct operation_t
  2. {
  3.     increment,
  4.     decrement,
  5.     advance,
  6.     equal,
  7.     distance,
  8.     dereference
  9. };
  10.  
  11. using manager_t = void (*) (operation_t, const boost::any &, const void *, void *);
  12.  
  13. template <typename Iterator, typename Difference>
  14. void manage (operation_t todo, const boost::any & first, const void * second, void * result)
  15. {
  16.     using value_type = iterator_value_t<Iterator>;
  17.     switch (todo)
  18.     {
  19.         case operation_t::increment:
  20.         {
  21.             assert(second == nullptr);
  22.             assert(result == nullptr);
  23.             ++boost::any_cast<Iterator &>(const_cast<boost::any &>(first));
  24.             break;
  25.         }
  26.         case operation_t::decrement:
  27.         {
  28.             assert(second == nullptr);
  29.             assert(result == nullptr);
  30.             --boost::any_cast<Iterator &>(const_cast<boost::any &>(first));
  31.             break;
  32.         }
  33.         case operation_t::advance:
  34.         {
  35.             assert(result == nullptr);
  36.             using std::advance;
  37.             advance(boost::any_cast<Iterator &>(const_cast<boost::any &>(first)), *static_cast<const Difference *>(second));
  38.             break;
  39.         }
  40.         case operation_t::equal:
  41.         {
  42.             *static_cast<bool *>(result) = (boost::any_cast<const Iterator &>(first) == boost::any_cast<const Iterator &>(*static_cast<const boost::any *>(second)));
  43.             break;
  44.         }
  45.         case operation_t::distance:
  46.         {
  47.             using std::distance;
  48.             *static_cast<Difference *>(result) =
  49.                 distance(boost::any_cast<const Iterator &>(first), boost::any_cast<const Iterator &>(*static_cast<const boost::any *>(second)));
  50.             break;
  51.         }
  52.         case operation_t::dereference:
  53.         {
  54.             assert(second == nullptr);
  55.             *static_cast<const value_type **>(result) = std::addressof(*boost::any_cast<const Iterator &>(first));
  56.             break;
  57.         }
  58.     }
  59. }
  60.  
  61. template <typename Value, typename Category>
  62. class any_iterator:
  63.     public boost::iterator_facade
  64.     <
  65.         any_iterator<Value, Category>,
  66.         Value,
  67.         typename boost::iterator_category_to_traversal<Category>::type,
  68.         Value &
  69.     >
  70. {
  71. private:
  72.     using base_type =
  73.         boost::iterator_facade
  74.         <
  75.             any_iterator<Value, Category>,
  76.             Value,
  77.             typename boost::iterator_category_to_traversal<Category>::type,
  78.             Value &
  79.         >;
  80.  
  81. public:
  82.     template <typename Iterator>
  83.     explicit any_iterator (Iterator i):
  84.         m_iterator(std::move(i)),
  85.         m_manager(&manage<Iterator, typename base_type::difference_type>)
  86.     {
  87.     }
  88.  
  89.     any_iterator () = default;
  90.  
  91. private:
  92.     friend class boost::iterator_core_access;
  93.  
  94.     void increment ()
  95.     {
  96.         m_manager(operation_t::increment, m_iterator, nullptr, nullptr);
  97.     }
  98.  
  99.     void decrement ()
  100.     {
  101.         m_manager(operation_t::decrement, m_iterator, nullptr, nullptr);
  102.     }
  103.  
  104.     void advance (typename base_type::difference_type n)
  105.     {
  106.         m_manager(operation_t::advance, m_iterator, std::addressof(n), nullptr);
  107.     }
  108.  
  109.     bool equal (const any_iterator & that) const
  110.     {
  111.         assert(this->m_manager == that.m_manager);
  112.         bool are_equal;
  113.         m_manager(operation_t::equal, m_iterator, std::addressof(that), std::addressof(are_equal));
  114.         return are_equal;
  115.     }
  116.  
  117.     typename base_type::difference_type distance_to (const any_iterator & that) const
  118.     {
  119.         assert(this->m_manager == that.m_manager);
  120.         typename base_type::difference_type distance;
  121.         m_manager(operation_t::distance, m_iterator, std::addressof(that), std::addressof(distance));
  122.         return distance;
  123.     }
  124.  
  125.     typename base_type::reference dereference () const
  126.     {
  127.         typename base_type::value_type * pointer;
  128.         m_manager(operation_t::dereference, m_iterator, nullptr, std::addressof(pointer));
  129.         return *pointer;
  130.     }
  131.  
  132. private:
  133.     boost::any m_iterator;
  134.     manager_t m_manager;
  135. };
  136.  
  137. template <typename Value, typename Category>
  138. using any_range = boost::iterator_range<any_iterator<Value, Category>>;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement