// Copyright David Abrahams 2003. Use, modification and distribution is // subject to the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #include using namespace boost; // Utility function which converts an iterator_category into a // traversal tag template typename iterator_category_to_traversal::type c2t(C) { typedef typename iterator_category_to_traversal::type result; return result(); } struct v { v(); ~v(); }; // // Test conversions from iterator_tag<...> to old-style iterator categories // // These "solid" tag types ensure exact matching of iterator // classification, because unlike the std:: iterator tags, they're not // inter-convertible struct output_iter {}; struct input_iter {}; struct input_output_iter {}; struct forward_iter {}; struct bidirectional_iter {}; struct random_access_iter{} ; // Convert various old-style categories into "solid" tags. input_iter cat(std::input_iterator_tag); output_iter cat(std::output_iterator_tag); input_output_iter cat(boost::detail::input_output_iterator_tag); forward_iter cat(std::forward_iterator_tag); bidirectional_iter cat(std::bidirectional_iterator_tag); random_access_iter cat(std::random_access_iterator_tag); random_access_iter x1 = cat(iterator_tag()); random_access_iter x2 = cat(iterator_tag()); bidirectional_iter x3 = cat(iterator_tag()); forward_iter x4 = cat(iterator_tag()); input_output_iter x5 = cat(iterator_tag()); input_iter x6 = cat(iterator_tag()); output_iter x7 = cat(iterator_tag()); // // Test conversion from old-style iterator categories to traversal categories // // These "solid" tag types ensure exact matching of iterator // classification, because unlike the traversal tags, they're not // inter-convertible struct incrementable_traversal {}; struct single_pass_traversal {}; struct forward_traversal {}; struct bidirectional_traversal {}; struct random_access_traversal {} ; // Convert various traversal categories into "solid" tags incrementable_traversal trav(incrementable_traversal_tag); single_pass_traversal trav(single_pass_traversal_tag); forward_traversal trav(forward_traversal_tag); bidirectional_traversal trav(bidirectional_traversal_tag); random_access_traversal trav(random_access_traversal_tag); // Show that full types of tags that are already traversal categories // are preserved iterator_tag yz1 = c2t(iterator_tag()); // Test traversal extraction from both old-style and new-style tags random_access_traversal yy1 = trav(c2t(iterator_tag())); bidirectional_traversal yy2 = trav(c2t(iterator_tag())); forward_traversal yy3 = trav(c2t(iterator_tag())); single_pass_traversal yy4 = trav(c2t(iterator_tag())); incrementable_traversal yy5 = trav(c2t(iterator_tag())); random_access_traversal z1 = trav(c2t(std::random_access_iterator_tag())); bidirectional_traversal z2 = trav(c2t(std::bidirectional_iterator_tag())); forward_traversal z3 = trav(c2t(std::forward_iterator_tag())); single_pass_traversal z4 = trav(c2t(std::input_iterator_tag())); incrementable_traversal z5 = trav(c2t(std::output_iterator_tag()));