Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Feature request] Consider adding support of reference proxy #48

Open
tower120 opened this issue Dec 1, 2018 · 0 comments
Open

[Feature request] Consider adding support of reference proxy #48

tower120 opened this issue Dec 1, 2018 · 0 comments

Comments

@tower120
Copy link

tower120 commented Dec 1, 2018

Continuing #47.
Currently, iterator_facade does not allow to have RandomAcess iterator with reference proxy (aka std::vector<bool>::iterator::reference) .

It looks like that the only thing that prevent this - is iterator-category deduction/override rules https://www.boost.org/doc/libs/1_68_0/libs/iterator/doc/iterator_facade.html :

iterator-category(C,R,V) :=
   if (C is convertible to std::input_iterator_tag
       || C is convertible to std::output_iterator_tag
   )
       return C

   else if (C is not convertible to incrementable_traversal_tag)
       the program is ill-formed

   else return a type X satisfying the following two constraints:

      1. X is convertible to X1, and not to any more-derived
         type, where X1 is defined by:

           if (R is a reference type
               && C is convertible to forward_traversal_tag)
           {
               if (C is convertible to random_access_traversal_tag)
                   X1 = random_access_iterator_tag
               else if (C is convertible to bidirectional_traversal_tag)
                   X1 = bidirectional_iterator_tag
               else
                   X1 = forward_iterator_tag
           }
           else
           {
               if (C is convertible to single_pass_traversal_tag
                   && R is convertible to V)
                   X1 = input_iterator_tag
               else
                   X1 = C
           }

      2. category-to-traversal(X) is convertible to the most
         derived traversal tag type to which X is also
         convertible, and not to any more-derived traversal tag
         type.

The simplest solution for now, seems to override manually iterator_category in Derived class.


Maybe add some proxy tag? Like:

class node_iterator
	: public boost::iterator_facade
	  <
		node_iterator
		, std::pair<int, int>
		, boost::bidirectional_traversal_tag
		, boost::iterator_facade::proxy_reference<std::pair<int, int>>
	  >

And do not downgrade iterator-category, if proxy_reference occurs.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant