mirror of
				https://github.com/boostorg/utility.git
				synced 2025-10-31 08:21:45 +01:00 
			
		
		
		
	Compare commits
	
		
			10 Commits
		
	
	
		
			boost-1.47
			...
			svn-branch
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 0650e4f164 | ||
|  | 7547fc7c8d | ||
|  | 1e283a16a6 | ||
|  | c64c6c2192 | ||
|  | 80277b7c28 | ||
|  | 3d90fc5e72 | ||
|  | 05cb94b311 | ||
|  | 1b627a9875 | ||
|  | 9b95ea5675 | ||
|  | df37d2c47e | 
| @@ -1,60 +0,0 @@ | ||||
| // (C) Copyright Jeremy Siek 2000. | ||||
| // Distributed under 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 <boost/config.hpp> | ||||
| #include <algorithm> | ||||
| #include <iostream> | ||||
| #include <iterator> | ||||
| #include <vector> | ||||
| #include <boost/iterator/counting_iterator.hpp> | ||||
| #include <boost/iterator/indirect_iterator.hpp> | ||||
|  | ||||
| int main(int, char*[]) | ||||
| { | ||||
|   // Example of using counting_iterator_generator | ||||
|   std::cout << "counting from 0 to 4:" << std::endl; | ||||
|   boost::counting_iterator<int> first(0), last(4); | ||||
|   std::copy(first, last, std::ostream_iterator<int>(std::cout, " ")); | ||||
|   std::cout << std::endl; | ||||
|  | ||||
|   // Example of using make_counting_iterator() | ||||
|   std::cout << "counting from -5 to 4:" << std::endl; | ||||
|   std::copy(boost::make_counting_iterator(-5), | ||||
|             boost::make_counting_iterator(5), | ||||
|             std::ostream_iterator<int>(std::cout, " ")); | ||||
|   std::cout << std::endl; | ||||
|  | ||||
|   // Example of using counting iterator to create an array of pointers. | ||||
| #if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551)) | ||||
|   const | ||||
| #endif  | ||||
|       int N = 7; | ||||
|   std::vector<int> numbers; | ||||
|   // Fill "numbers" array with [0,N) | ||||
|   std::copy( | ||||
|       boost::make_counting_iterator(0) | ||||
|       , boost::make_counting_iterator(N) | ||||
|       , std::back_inserter(numbers)); | ||||
|  | ||||
|   std::vector<std::vector<int>::iterator> pointers; | ||||
|  | ||||
|   // Use counting iterator to fill in the array of pointers. | ||||
|   // causes an ICE with MSVC6 | ||||
|   std::copy(boost::make_counting_iterator(numbers.begin()), | ||||
|             boost::make_counting_iterator(numbers.end()), | ||||
|             std::back_inserter(pointers)); | ||||
|  | ||||
|   // Use indirect iterator to print out numbers by accessing | ||||
|   // them through the array of pointers. | ||||
|   std::cout << "indirectly printing out the numbers from 0 to "  | ||||
|             << N << std::endl; | ||||
|   std::copy(boost::make_indirect_iterator(pointers.begin()), | ||||
|             boost::make_indirect_iterator(pointers.end()), | ||||
|             std::ostream_iterator<int>(std::cout, " ")); | ||||
|   std::cout << std::endl; | ||||
|    | ||||
|   return 0; | ||||
| } | ||||
| @@ -128,7 +128,7 @@ When valid, <TT>enable_if_c<B, T>::type</TT> equals <TT>T</TT>. | ||||
| The <TT>enable_if_c</TT> template can thus be used for controlling when functions are considered for | ||||
| overload resolution and when they are not.  | ||||
| For example, the following function is defined for all arithmetic types (according to the | ||||
| classification of the <A HREF="http://www.boost.org/libs/type_traits">Boost type_traits library</A>): | ||||
| classification of the <A HREF="../type_traits/index.html">Boost type_traits library</A>): | ||||
| <PRE>template <class T> | ||||
| typename enable_if_c<boost::is_arithmetic<T>::value, T>::type  | ||||
| foo(T t) { return t; } | ||||
|   | ||||
| @@ -1,61 +0,0 @@ | ||||
| // Example of using the filter iterator adaptor from | ||||
| // boost/iterator_adaptors.hpp. | ||||
|  | ||||
| //  (C) Copyright Jeremy Siek 1999. | ||||
| // Distributed under 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 <boost/config.hpp> | ||||
| #include <algorithm> | ||||
| #include <functional> | ||||
| #include <iostream> | ||||
| #include <boost/iterator/filter_iterator.hpp> | ||||
|  | ||||
| struct is_positive_number { | ||||
|   bool operator()(int x) { return 0 < x; } | ||||
| }; | ||||
|  | ||||
| int main() | ||||
| { | ||||
|   int numbers_[] = { 0, -1, 4, -3, 5, 8, -2 }; | ||||
|   const int N = sizeof(numbers_)/sizeof(int); | ||||
|    | ||||
|   typedef int* base_iterator; | ||||
|   base_iterator numbers(numbers_); | ||||
|    | ||||
|   // Example using make_filter_iterator() | ||||
|   std::copy(boost::make_filter_iterator<is_positive_number>(numbers, numbers + N), | ||||
|             boost::make_filter_iterator<is_positive_number>(numbers + N, numbers + N), | ||||
|             std::ostream_iterator<int>(std::cout, " ")); | ||||
|   std::cout << std::endl; | ||||
|  | ||||
|   // Example using filter_iterator | ||||
|   typedef boost::filter_iterator<is_positive_number, base_iterator> | ||||
|     FilterIter; | ||||
|    | ||||
|   is_positive_number predicate; | ||||
|   FilterIter filter_iter_first(predicate, numbers, numbers + N); | ||||
|   FilterIter filter_iter_last(predicate, numbers + N, numbers + N); | ||||
|  | ||||
|   std::copy(filter_iter_first, filter_iter_last, std::ostream_iterator<int>(std::cout, " ")); | ||||
|   std::cout << std::endl; | ||||
|  | ||||
|   // Another example using make_filter_iterator() | ||||
|   std::copy( | ||||
|       boost::make_filter_iterator( | ||||
|           std::bind2nd(std::greater<int>(), -2) | ||||
|         , numbers, numbers + N) | ||||
|              | ||||
|     , boost::make_filter_iterator( | ||||
|           std::bind2nd(std::greater<int>(), -2) | ||||
|         , numbers + N, numbers + N) | ||||
|        | ||||
|     , std::ostream_iterator<int>(std::cout, " ") | ||||
|   ); | ||||
|    | ||||
|   std::cout << std::endl; | ||||
|    | ||||
|    | ||||
|   return 0; | ||||
| } | ||||
| @@ -1,46 +0,0 @@ | ||||
| // (C) Copyright Jeremy Siek 2001. | ||||
| // Distributed under 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) | ||||
|  | ||||
| // Revision History: | ||||
|  | ||||
| // 27 Feb 2001   Jeremy Siek | ||||
| //      Initial checkin. | ||||
|  | ||||
| #include <iostream> | ||||
| #include <string> | ||||
| #include <vector> | ||||
|  | ||||
| #include <boost/function_output_iterator.hpp> | ||||
|  | ||||
| struct string_appender | ||||
| { | ||||
|     string_appender(std::string& s) | ||||
|         : m_str(&s) | ||||
|     {} | ||||
|      | ||||
|     void operator()(const std::string& x) const | ||||
|     { | ||||
|         *m_str += x; | ||||
|     } | ||||
|  | ||||
|     std::string* m_str; | ||||
| }; | ||||
|  | ||||
| int main(int, char*[]) | ||||
| { | ||||
|   std::vector<std::string> x; | ||||
|   x.push_back("hello"); | ||||
|   x.push_back(" "); | ||||
|   x.push_back("world"); | ||||
|   x.push_back("!"); | ||||
|  | ||||
|   std::string s = ""; | ||||
|   std::copy(x.begin(), x.end(),  | ||||
|             boost::make_function_output_iterator(string_appender(s))); | ||||
|    | ||||
|   std::cout << s << std::endl; | ||||
|  | ||||
|   return 0; | ||||
| } | ||||
| @@ -73,18 +73,13 @@ template<class T> inline reference_wrapper<T const> BOOST_REF_CONST cref(T const | ||||
| # undef BOOST_REF_CONST | ||||
|  | ||||
| # ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION | ||||
|  | ||||
| template<typename T> | ||||
| class is_reference_wrapper | ||||
|     : public mpl::false_ | ||||
| { | ||||
| }; | ||||
|  | ||||
| template<typename T> | ||||
| class is_reference_wrapper<reference_wrapper<T> > | ||||
|     : public mpl::true_ | ||||
| { | ||||
| }; | ||||
|  | ||||
| template<typename T> | ||||
| class unwrap_reference | ||||
| { | ||||
| @@ -92,12 +87,30 @@ class unwrap_reference | ||||
|     typedef T type; | ||||
| }; | ||||
|  | ||||
| template<typename T> | ||||
| class unwrap_reference<reference_wrapper<T> > | ||||
| { | ||||
|  public: | ||||
|     typedef T type; | ||||
| }; | ||||
| #  define AUX_REFERENCE_WRAPPER_METAFUNCTIONS_DEF(X) \ | ||||
| template<typename T> \ | ||||
| class is_reference_wrapper< X > \ | ||||
|     : public mpl::true_ \ | ||||
| { \ | ||||
| }; \ | ||||
| \ | ||||
| template<typename T> \ | ||||
| class unwrap_reference< X > \ | ||||
| { \ | ||||
|  public: \ | ||||
|     typedef T type; \ | ||||
| }; \ | ||||
| /**/ | ||||
|  | ||||
| AUX_REFERENCE_WRAPPER_METAFUNCTIONS_DEF(reference_wrapper<T>) | ||||
| #if !defined(BOOST_NO_CV_SPECIALIZATIONS) | ||||
| AUX_REFERENCE_WRAPPER_METAFUNCTIONS_DEF(reference_wrapper<T> const) | ||||
| AUX_REFERENCE_WRAPPER_METAFUNCTIONS_DEF(reference_wrapper<T> volatile) | ||||
| AUX_REFERENCE_WRAPPER_METAFUNCTIONS_DEF(reference_wrapper<T> const volatile) | ||||
| #endif | ||||
|  | ||||
| #  undef AUX_REFERENCE_WRAPPER_METAFUNCTIONS_DEF | ||||
|  | ||||
| # else // no partial specialization | ||||
|  | ||||
| } // namespace boost | ||||
|   | ||||
| @@ -44,10 +44,10 @@ | ||||
|  | ||||
| #define BOOST_PRIVATE_CTR_DEF( z, n, data )                            \ | ||||
|     template < BOOST_PP_ENUM_PARAMS(n, typename T) >                   \ | ||||
| 	explicit base_from_member( BOOST_PP_ENUM_BINARY_PARAMS(n, T, x) )  \ | ||||
| 	    : member( BOOST_PP_ENUM_PARAMS(n, x) )                         \ | ||||
| 		{}                                                             \ | ||||
| 	/**/ | ||||
|     explicit base_from_member( BOOST_PP_ENUM_BINARY_PARAMS(n, T, x) )  \ | ||||
|         : member( BOOST_PP_ENUM_PARAMS(n, x) )                         \ | ||||
|         {}                                                             \ | ||||
|     /**/ | ||||
|  | ||||
|  | ||||
| namespace boost | ||||
| @@ -73,7 +73,7 @@ protected: | ||||
|         {} | ||||
|  | ||||
|     BOOST_PP_REPEAT_FROM_TO( 1, BOOST_PP_INC(BOOST_BASE_FROM_MEMBER_MAX_ARITY), | ||||
| 	 BOOST_PRIVATE_CTR_DEF, _ ) | ||||
|      BOOST_PRIVATE_CTR_DEF, _ ) | ||||
|  | ||||
| };  // boost::base_from_member | ||||
|  | ||||
|   | ||||
| @@ -1,59 +0,0 @@ | ||||
| // (C) Copyright Jeremy Siek 2000. | ||||
| // Distributed under 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 <boost/config.hpp> | ||||
| #include <vector> | ||||
| #include <iostream> | ||||
| #include <iterator> | ||||
| #include <functional> | ||||
| #include <algorithm> | ||||
| #include <boost/iterator/indirect_iterator.hpp> | ||||
|  | ||||
| int main(int, char*[]) | ||||
| { | ||||
|   char characters[] = "abcdefg"; | ||||
|   const int N = sizeof(characters)/sizeof(char) - 1; // -1 since characters has a null char | ||||
|   char* pointers_to_chars[N];                        // at the end. | ||||
|   for (int i = 0; i < N; ++i) | ||||
|     pointers_to_chars[i] = &characters[i]; | ||||
|  | ||||
|   // Example of using indirect_iterator_generator | ||||
|    | ||||
|   boost::indirect_iterator<char**, char> | ||||
|     indirect_first(pointers_to_chars), indirect_last(pointers_to_chars + N); | ||||
|  | ||||
|   std::copy(indirect_first, indirect_last, std::ostream_iterator<char>(std::cout, ",")); | ||||
|   std::cout << std::endl; | ||||
|    | ||||
|  | ||||
|   // Example of using indirect_iterator_pair_generator | ||||
|  | ||||
|   char mutable_characters[N]; | ||||
|   char* pointers_to_mutable_chars[N]; | ||||
|   for (int j = 0; j < N; ++j) | ||||
|     pointers_to_mutable_chars[j] = &mutable_characters[j]; | ||||
|  | ||||
|   boost::indirect_iterator<char* const*> mutable_indirect_first(pointers_to_mutable_chars), | ||||
|     mutable_indirect_last(pointers_to_mutable_chars + N); | ||||
|   boost::indirect_iterator<char* const*, char const> const_indirect_first(pointers_to_chars), | ||||
|     const_indirect_last(pointers_to_chars + N); | ||||
|  | ||||
|   std::transform(const_indirect_first, const_indirect_last, | ||||
|                  mutable_indirect_first, std::bind1st(std::plus<char>(), 1)); | ||||
|  | ||||
|   std::copy(mutable_indirect_first, mutable_indirect_last, | ||||
|             std::ostream_iterator<char>(std::cout, ",")); | ||||
|   std::cout << std::endl; | ||||
|  | ||||
|    | ||||
|   // Example of using make_indirect_iterator() | ||||
|  | ||||
|   std::copy(boost::make_indirect_iterator(pointers_to_chars),  | ||||
|             boost::make_indirect_iterator(pointers_to_chars + N), | ||||
|             std::ostream_iterator<char>(std::cout, ",")); | ||||
|   std::cout << std::endl; | ||||
|    | ||||
|   return 0; | ||||
| } | ||||
| @@ -1,46 +0,0 @@ | ||||
| // (C) Copyright Jeremy Siek 2000. | ||||
| // Distributed under 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 <functional> | ||||
| #include <algorithm> | ||||
| #include <iostream> | ||||
| #include <boost/iterator/transform_iterator.hpp> | ||||
| #include <boost/pending/integer_range.hpp> | ||||
|  | ||||
| int | ||||
| main(int, char*[]) | ||||
| { | ||||
|   // This is a simple example of using the transform_iterators class to | ||||
|   // generate iterators that multiply the value returned by dereferencing | ||||
|   // the iterator. In this case we are multiplying by 2. | ||||
|   // Would be cooler to use lambda library in this example. | ||||
|  | ||||
|   int x[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; | ||||
|  | ||||
|   typedef std::binder1st< std::multiplies<int> > Function; | ||||
|    | ||||
|   typedef boost::transform_iterator<Function, int*> doubling_iterator; | ||||
|  | ||||
|   doubling_iterator i(x, std::bind1st(std::multiplies<int>(), 2)), | ||||
|     i_end(x + sizeof(x)/sizeof(int), std::bind1st(std::multiplies<int>(), 2)); | ||||
|  | ||||
|   std::cout << "multiplying the array by 2:" << std::endl; | ||||
|   while (i != i_end) | ||||
|     std::cout << *i++ << " "; | ||||
|   std::cout << std::endl; | ||||
|  | ||||
|   // Here is an example of counting from 0 to 5 using the integer_range class. | ||||
|  | ||||
|   boost::integer_range<int> r(0,5); | ||||
|  | ||||
|   std::cout << "counting to from 0 to 4:" << std::endl; | ||||
|   std::copy(r.begin(), r.end(), std::ostream_iterator<int>(std::cout, " ")); | ||||
|   std::cout << std::endl; | ||||
|  | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
|  | ||||
| @@ -1,214 +0,0 @@ | ||||
| //  (C) Copyright David Abrahams 2002. | ||||
| // Distributed under 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) | ||||
|  | ||||
| //  See http://www.boost.org for most recent version including documentation. | ||||
|  | ||||
| //  Revision History | ||||
| //  04 Mar 2001 Patches for Intel C++ (Dave Abrahams) | ||||
| //  19 Feb 2001 Take advantage of improved iterator_traits to do more tests | ||||
| //              on MSVC. Reordered some #ifdefs for coherency. | ||||
| //              (David Abrahams) | ||||
| //  13 Feb 2001 Test new VC6 workarounds (David Abrahams) | ||||
| //  11 Feb 2001 Final fixes for Borland (David Abrahams) | ||||
| //  11 Feb 2001 Some fixes for Borland get it closer on that compiler | ||||
| //              (David Abrahams) | ||||
| //  07 Feb 2001 More comprehensive testing; factored out static tests for | ||||
| //              better reuse (David Abrahams) | ||||
| //  21 Jan 2001 Quick fix to my_iterator, which wasn't returning a | ||||
| //              reference type from operator* (David Abrahams) | ||||
| //  19 Jan 2001 Initial version with iterator operators (David Abrahams) | ||||
|  | ||||
| #include <boost/detail/iterator.hpp> | ||||
| #include <boost/type_traits/is_same.hpp> | ||||
| #include <boost/operators.hpp> | ||||
| #include <boost/static_assert.hpp> | ||||
| #include <iterator> | ||||
| #include <vector> | ||||
| #include <list> | ||||
| #include <cassert> | ||||
| #include <iostream> | ||||
|  | ||||
| // A UDT for which we can specialize std::iterator_traits<element*> on | ||||
| // compilers which don't support partial specialization. There's no | ||||
| // other reasonable way to test pointers on those compilers. | ||||
| struct element {}; | ||||
|  | ||||
| // An iterator for which we can get traits. | ||||
| struct my_iterator1 | ||||
|     : boost::forward_iterator_helper<my_iterator1, char, long, const char*, const char&> | ||||
| { | ||||
|     my_iterator1(const char* p) : m_p(p) {} | ||||
|      | ||||
|     bool operator==(const my_iterator1& rhs) const | ||||
|         { return this->m_p == rhs.m_p; } | ||||
|  | ||||
|     my_iterator1& operator++() { ++this->m_p; return *this; } | ||||
|     const char& operator*() { return *m_p; } | ||||
|  private: | ||||
|     const char* m_p; | ||||
| }; | ||||
|  | ||||
| // Used to prove that we don't require std::iterator<> in the hierarchy under | ||||
| // MSVC6, and that we can compute all the traits for a standard-conforming UDT | ||||
| // iterator. | ||||
| struct my_iterator2 | ||||
|     : boost::equality_comparable<my_iterator2 | ||||
|     , boost::incrementable<my_iterator2 | ||||
|     , boost::dereferenceable<my_iterator2,const char*> > > | ||||
| { | ||||
|     typedef char value_type; | ||||
|     typedef long difference_type; | ||||
|     typedef const char* pointer; | ||||
|     typedef const char& reference; | ||||
|     typedef std::forward_iterator_tag iterator_category; | ||||
|      | ||||
|     my_iterator2(const char* p) : m_p(p) {} | ||||
|      | ||||
|     bool operator==(const my_iterator2& rhs) const | ||||
|         { return this->m_p == rhs.m_p; } | ||||
|  | ||||
|     my_iterator2& operator++() { ++this->m_p; return *this; } | ||||
|     const char& operator*() { return *m_p; } | ||||
|  private: | ||||
|     const char* m_p; | ||||
| }; | ||||
|  | ||||
| // Used to prove that we're not overly confused by the existence of | ||||
| // std::iterator<> in the hierarchy under MSVC6 - we should find that | ||||
| // boost::detail::iterator_traits<my_iterator3>::difference_type is int. | ||||
| struct my_iterator3 : my_iterator1 | ||||
| { | ||||
|     typedef int difference_type; | ||||
|     my_iterator3(const char* p) | ||||
|         : my_iterator1(p) {} | ||||
| }; | ||||
|  | ||||
| // | ||||
| // Assertion tools.  Used instead of BOOST_STATIC_ASSERT because that | ||||
| // doesn't give us a nice stack backtrace | ||||
| // | ||||
| template <bool = false> struct assertion; | ||||
|  | ||||
| template <> struct assertion<true> | ||||
| { | ||||
|     typedef char type; | ||||
| }; | ||||
|  | ||||
| template <class T, class U> | ||||
| struct assert_same | ||||
|     : assertion<(::boost::is_same<T,U>::value)> | ||||
| { | ||||
| }; | ||||
|  | ||||
|  | ||||
| // Iterator tests | ||||
| template <class Iterator, | ||||
|     class value_type, class difference_type, class pointer, class reference, class category> | ||||
| struct non_portable_tests | ||||
| { | ||||
|     typedef typename boost::detail::iterator_traits<Iterator>::pointer test_pt; | ||||
|     typedef typename boost::detail::iterator_traits<Iterator>::reference test_rt; | ||||
|     typedef typename assert_same<test_pt, pointer>::type a1; | ||||
|     typedef typename assert_same<test_rt, reference>::type a2; | ||||
| }; | ||||
|  | ||||
| template <class Iterator, | ||||
|     class value_type, class difference_type, class pointer, class reference, class category> | ||||
| struct portable_tests | ||||
| { | ||||
|     typedef typename boost::detail::iterator_traits<Iterator>::difference_type test_dt; | ||||
|     typedef typename boost::detail::iterator_traits<Iterator>::iterator_category test_cat; | ||||
|     typedef typename assert_same<test_dt, difference_type>::type a1; | ||||
|     typedef typename assert_same<test_cat, category>::type a2; | ||||
| }; | ||||
|  | ||||
| // Test iterator_traits | ||||
| template <class Iterator, | ||||
|     class value_type, class difference_type, class pointer, class reference, class category> | ||||
| struct input_iterator_test | ||||
|     : portable_tests<Iterator,value_type,difference_type,pointer,reference,category> | ||||
| { | ||||
|     typedef typename boost::detail::iterator_traits<Iterator>::value_type test_vt; | ||||
|     typedef typename assert_same<test_vt, value_type>::type a1; | ||||
| }; | ||||
|  | ||||
| template <class Iterator, | ||||
|     class value_type, class difference_type, class pointer, class reference, class category> | ||||
| struct non_pointer_test | ||||
|     : input_iterator_test<Iterator,value_type,difference_type,pointer,reference,category> | ||||
|       , non_portable_tests<Iterator,value_type,difference_type,pointer,reference,category> | ||||
| { | ||||
| }; | ||||
|  | ||||
| template <class Iterator, | ||||
|     class value_type, class difference_type, class pointer, class reference, class category> | ||||
| struct maybe_pointer_test | ||||
|     : portable_tests<Iterator,value_type,difference_type,pointer,reference,category> | ||||
|       , non_portable_tests<Iterator,value_type,difference_type,pointer,reference,category> | ||||
| { | ||||
| }; | ||||
|  | ||||
| input_iterator_test<std::istream_iterator<int>, int, std::ptrdiff_t, int*, int&, std::input_iterator_tag> | ||||
|         istream_iterator_test; | ||||
|  | ||||
| #if defined(__BORLANDC__) && !defined(__SGI_STL_PORT) | ||||
| typedef ::std::char_traits<char>::off_type distance; | ||||
| non_pointer_test<std::ostream_iterator<int>,int, | ||||
|     distance,int*,int&,std::output_iterator_tag> ostream_iterator_test; | ||||
| #elif defined(BOOST_MSVC_STD_ITERATOR) | ||||
| non_pointer_test<std::ostream_iterator<int>, | ||||
|     int, void, int*, int&, std::output_iterator_tag> | ||||
|         ostream_iterator_test; | ||||
| #else | ||||
| non_pointer_test<std::ostream_iterator<int>, | ||||
|     void, void, void, void, std::output_iterator_tag> | ||||
|         ostream_iterator_test; | ||||
| #endif | ||||
|  | ||||
|  | ||||
| #ifdef __KCC | ||||
|   typedef long std_list_diff_type; | ||||
| #else | ||||
|   typedef std::ptrdiff_t std_list_diff_type; | ||||
| #endif | ||||
|  | ||||
| non_pointer_test<std::list<int>::iterator, int, std_list_diff_type, int*, int&, std::bidirectional_iterator_tag> | ||||
|         list_iterator_test; | ||||
|  | ||||
| maybe_pointer_test<std::vector<int>::iterator, int, std::ptrdiff_t, int*, int&, std::random_access_iterator_tag> | ||||
|         vector_iterator_test; | ||||
|  | ||||
| maybe_pointer_test<int*, int, std::ptrdiff_t, int*, int&, std::random_access_iterator_tag> | ||||
|         int_pointer_test; | ||||
|  | ||||
| non_pointer_test<my_iterator1, char, long, const char*, const char&, std::forward_iterator_tag> | ||||
|        my_iterator1_test; | ||||
|                      | ||||
| non_pointer_test<my_iterator2, char, long, const char*, const char&, std::forward_iterator_tag> | ||||
|        my_iterator2_test; | ||||
|  | ||||
| non_pointer_test<my_iterator3, char, int, const char*, const char&, std::forward_iterator_tag> | ||||
|        my_iterator3_test; | ||||
|  | ||||
| int main() | ||||
| { | ||||
|     char chars[100]; | ||||
|     int ints[100]; | ||||
|  | ||||
|     for (int length = 3; length < 100; length += length / 3) | ||||
|     { | ||||
|         std::list<int> l(length); | ||||
|         assert(boost::detail::distance(l.begin(), l.end()) == length); | ||||
|          | ||||
|         std::vector<int> v(length); | ||||
|         assert(boost::detail::distance(v.begin(), v.end()) == length); | ||||
|  | ||||
|         assert(boost::detail::distance(&ints[0], ints + length) == length); | ||||
|         assert(boost::detail::distance(my_iterator1(chars), my_iterator1(chars + length)) == length); | ||||
|         assert(boost::detail::distance(my_iterator2(chars), my_iterator2(chars + length)) == length); | ||||
|         assert(boost::detail::distance(my_iterator3(chars), my_iterator3(chars + length)) == length); | ||||
|     } | ||||
|     return 0; | ||||
| } | ||||
| @@ -1955,7 +1955,7 @@ T operator+( T lhs, const T& rhs ) | ||||
|     output iterator to writing just two member functions - an appropriate | ||||
|     constructor and a copy-assignment operator. For example, here is a | ||||
|     possible implementation of <code><a href= | ||||
|     "function_output_iterator.htm">boost::function_output_iterator</a></code> | ||||
|     "../iterator/doc/function_output_iterator.html">boost::function_output_iterator</a></code> | ||||
|     adaptor:</p> | ||||
| <pre> | ||||
| template<class UnaryFunction> | ||||
| @@ -2119,10 +2119,10 @@ public: | ||||
|     backward-compatible.</p> | ||||
|     <hr> | ||||
|  | ||||
|     <p>Revised: 03 Dec 2003</p> | ||||
|     <p>Revised: 29 Oct 2004</p> | ||||
|  | ||||
|     <p>Copyright © Beman Dawes, David Abrahams, 1999-2001.</p> | ||||
|     <p>Copyright © Daniel Frey, 2002-2003.</p> | ||||
|     <p>Copyright © Daniel Frey, 2002-2004.</p> | ||||
|     <p>Use, modification, and distribution is subject to the Boost Software  | ||||
|     License, Version 1.0. (See accompanying file | ||||
|     <a href="../../LICENSE_1_0.txt">LICENSE_1_0.txt</a> or copy at | ||||
|   | ||||
| @@ -1,103 +0,0 @@ | ||||
| // (C) Copyright Jeremy Siek 2000. | ||||
| // Distributed under 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 <boost/config.hpp> | ||||
| #include <list> | ||||
| #include <iostream> | ||||
| #include <iterator> | ||||
| #include <algorithm> | ||||
| #include <string> | ||||
| #include <boost/iterator/transform_iterator.hpp> | ||||
|  | ||||
| struct personnel_record { | ||||
|   personnel_record(std::string n, int id) : m_name(n), m_ID(id) { } | ||||
|   std::string m_name; | ||||
|   int m_ID; | ||||
| }; | ||||
|  | ||||
| struct select_name { | ||||
|   typedef personnel_record argument_type; | ||||
|   typedef std::string const& result_type; | ||||
|   const std::string& operator()(const personnel_record& r) const { | ||||
|     return r.m_name; | ||||
|   } | ||||
|   std::string& operator()(personnel_record& r) const { | ||||
|     return r.m_name; | ||||
|   } | ||||
| }; | ||||
|  | ||||
| struct select_ID { | ||||
|   typedef personnel_record argument_type; | ||||
|   typedef int& result_type; | ||||
|   const int& operator()(const personnel_record& r) const { | ||||
|     return r.m_ID; | ||||
|   } | ||||
|   int& operator()(personnel_record& r) const { | ||||
|     return r.m_ID; | ||||
|   } | ||||
| }; | ||||
|  | ||||
| int main(int, char*[]) | ||||
| { | ||||
|   std::list<personnel_record> personnel_list; | ||||
|  | ||||
|   personnel_list.push_back(personnel_record("Barney", 13423)); | ||||
|   personnel_list.push_back(personnel_record("Fred", 12343)); | ||||
|   personnel_list.push_back(personnel_record("Wilma", 62454)); | ||||
|   personnel_list.push_back(personnel_record("Betty", 20490)); | ||||
|  | ||||
|   // Example of using transform_iterator to print out the names in the | ||||
|   // personnel list using a projection. | ||||
|  | ||||
|   boost::transform_iterator< | ||||
|       select_name | ||||
|     , std::list<personnel_record>::iterator | ||||
| #ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION | ||||
|     , std::string | ||||
| #endif  | ||||
|   > | ||||
|     personnel_first(personnel_list.begin()), | ||||
|     personnel_last(personnel_list.end()); | ||||
|  | ||||
|   std::copy(personnel_first, personnel_last, | ||||
|             std::ostream_iterator<std::string>(std::cout, "\n")); | ||||
|   std::cout << std::endl; | ||||
|    | ||||
|   // Example of using transform_iterator with const_iterators to | ||||
|   // assign new ID numbers to the personnel. | ||||
|    | ||||
|   boost::transform_iterator< | ||||
|       select_ID, std::list<personnel_record>::iterator | ||||
|  > ID_first(personnel_list.begin()), | ||||
|     ID_last(personnel_list.end()); | ||||
|  | ||||
|   int new_id = 0; | ||||
|   while (ID_first != ID_last) { | ||||
|     *ID_first = new_id++; | ||||
|     ++ID_first; | ||||
|   } | ||||
|  | ||||
|     boost::transform_iterator< | ||||
|       select_ID, std::list<personnel_record>::const_iterator, int const& | ||||
|     > | ||||
|     const_ID_first(personnel_list.begin()), | ||||
|     const_ID_last(personnel_list.end()); | ||||
|  | ||||
|   std::copy(const_ID_first, const_ID_last, | ||||
|             std::ostream_iterator<int>(std::cout, " ")); | ||||
|   std::cout << std::endl; | ||||
|   std::cout << std::endl; | ||||
|  | ||||
| #ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION | ||||
|   // Example of using make_const_projection_iterator() | ||||
|   // to print out the names in the personnel list again. | ||||
|   std::copy( | ||||
|       boost::make_transform_iterator<select_name>(personnel_list.begin()) | ||||
|     , boost::make_transform_iterator<select_name>(personnel_list.end()) | ||||
|     , std::ostream_iterator<std::string>(std::cout, "\n")); | ||||
| #endif | ||||
|    | ||||
|   return 0; | ||||
| } | ||||
| @@ -7,8 +7,12 @@ | ||||
| // see 'ref_test.cpp' for run-time part | ||||
|  | ||||
| #include <boost/ref.hpp> | ||||
| #include <boost/type_traits/same_traits.hpp> | ||||
| #include <boost/type_traits/is_same.hpp> | ||||
| #include <boost/type_traits/remove_const.hpp> | ||||
| #include <boost/static_assert.hpp> | ||||
| #include <boost/detail/workaround.hpp> | ||||
|  | ||||
| #include <boost/mpl/assert.hpp> | ||||
|  | ||||
| namespace { | ||||
|  | ||||
| @@ -35,13 +39,23 @@ void is_reference_wrapper_test(T) | ||||
| template< typename R, typename Ref > | ||||
| void cxx_reference_test(Ref) | ||||
| { | ||||
| #if BOOST_WORKAROUND(__BORLANDC__, < 0x600) | ||||
|     typedef typename boost::remove_const<Ref>::type ref; | ||||
|     BOOST_STATIC_ASSERT((boost::is_same<R,ref>::value)); | ||||
| #else | ||||
|     BOOST_STATIC_ASSERT((boost::is_same<R,Ref>::value)); | ||||
| #endif | ||||
| } | ||||
|  | ||||
| template< typename R, typename Ref > | ||||
| void unwrap_reference_test(Ref) | ||||
| { | ||||
| #if BOOST_WORKAROUND(__BORLANDC__, < 0x600) | ||||
|     typedef typename boost::remove_const<Ref>::type ref; | ||||
|     typedef typename boost::unwrap_reference<ref>::type type; | ||||
| #else | ||||
|     typedef typename boost::unwrap_reference<Ref>::type type; | ||||
| #endif | ||||
|     BOOST_STATIC_ASSERT((boost::is_same<R,type>::value)); | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -1,47 +0,0 @@ | ||||
| // (C) Copyright Jeremy Siek 2000. | ||||
| // Distributed under 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 <boost/config.hpp> | ||||
| #include <iostream> | ||||
| #include <algorithm> | ||||
| #include <boost/iterator/reverse_iterator.hpp> | ||||
| #include <boost/detail/iterator.hpp> | ||||
|  | ||||
| //boost::detail::iterator_traits | ||||
| int main(int, char*[]) | ||||
| { | ||||
|   char letters_[] = "hello world!"; | ||||
|   const int N = sizeof(letters_)/sizeof(char) - 1; | ||||
|   typedef char* base_iterator; | ||||
|   base_iterator letters(letters_); | ||||
|    | ||||
|   std::cout << "original sequence of letters:\t" | ||||
|             << letters_ << std::endl; | ||||
|  | ||||
|   std::sort(letters, letters + N); | ||||
|  | ||||
|   // Use reverse_iterator_generator to print a sequence | ||||
|   // of letters in reverse order. | ||||
|    | ||||
|   boost::reverse_iterator<base_iterator> | ||||
|     reverse_letters_first(letters + N), | ||||
|     reverse_letters_last(letters); | ||||
|  | ||||
|   std::cout << "letters in descending order:\t"; | ||||
|   std::copy(reverse_letters_first, reverse_letters_last, | ||||
|             std::ostream_iterator<char>(std::cout)); | ||||
|   std::cout << std::endl; | ||||
|  | ||||
|   // Use make_reverse_iterator() to print the sequence | ||||
|   // of letters in reverse-reverse order. | ||||
|  | ||||
|   std::cout << "letters in ascending order:\t"; | ||||
|   std::copy(boost::make_reverse_iterator(reverse_letters_last), | ||||
|             boost::make_reverse_iterator(reverse_letters_first), | ||||
|             std::ostream_iterator<char>(std::cout)); | ||||
|   std::cout << std::endl; | ||||
|  | ||||
|   return 0; | ||||
| } | ||||
| @@ -27,7 +27,6 @@ test-suite utility | ||||
|         [ compile-fail ../checked_delete_test.cpp ] | ||||
|         [ run ../compressed_pair_test.cpp $(test_monitor) : -u ] | ||||
|         [ run ../current_function_test.cpp : : : <test-info>always_show_run_output ] | ||||
|         [ run ../iterator_traits_test.cpp ] | ||||
|         [ run ../iterators_test.cpp $(test_monitor) ] | ||||
|         [ run next_prior_test.cpp $(test_monitor) ] | ||||
|         [ compile-fail ../noncopyable_test.cpp ] | ||||
|   | ||||
| @@ -20,7 +20,6 @@ test-suite utility | ||||
|         [ compile-fail ../checked_delete_test.cpp ] | ||||
|         [ run ../compressed_pair_test.cpp ../../test/build//boost_test_exec_monitor : -u ] | ||||
|         [ run ../current_function_test.cpp : : : <test-info>always_show_run_output ] | ||||
|         [ run ../iterator_traits_test.cpp ] | ||||
|         [ run ../iterators_test.cpp ../../test/build//boost_test_exec_monitor ] | ||||
|         [ run next_prior_test.cpp ../../test/build//boost_test_exec_monitor ] | ||||
|         [ compile-fail ../noncopyable_test.cpp ] | ||||
|   | ||||
| @@ -1,76 +0,0 @@ | ||||
| // (C) Copyright Jeremy Siek 2000. | ||||
| // Distributed under 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 <functional> | ||||
| #include <algorithm> | ||||
| #include <iostream> | ||||
| #include <boost/iterator/transform_iterator.hpp> | ||||
|  | ||||
| // What a bummer. We can't use std::binder1st with transform iterator | ||||
| // because it does not have a default constructor. Here's a version | ||||
| // that does. | ||||
|  | ||||
| namespace boost { | ||||
|  | ||||
|   template <class Operation>  | ||||
|   class binder1st | ||||
|     : public std::unary_function<typename Operation::second_argument_type, | ||||
|                                  typename Operation::result_type> { | ||||
|   protected: | ||||
|     Operation op; | ||||
|     typename Operation::first_argument_type value; | ||||
|   public: | ||||
|     binder1st() { } // this had to be added! | ||||
|     binder1st(const Operation& x, | ||||
|               const typename Operation::first_argument_type& y) | ||||
|         : op(x), value(y) {} | ||||
|     typename Operation::result_type | ||||
|     operator()(const typename Operation::second_argument_type& x) const { | ||||
|       return op(value, x);  | ||||
|     } | ||||
|   }; | ||||
|  | ||||
|   template <class Operation, class T> | ||||
|   inline binder1st<Operation> bind1st(const Operation& op, const T& x) { | ||||
|     typedef typename Operation::first_argument_type arg1_type; | ||||
|     return binder1st<Operation>(op, arg1_type(x)); | ||||
|   } | ||||
|  | ||||
| } // namespace boost | ||||
|  | ||||
| int | ||||
| main(int, char*[]) | ||||
| { | ||||
|   // This is a simple example of using the transform_iterators class to | ||||
|   // generate iterators that multiply the value returned by dereferencing | ||||
|   // the iterator. In this case we are multiplying by 2. | ||||
|   // Would be cooler to use lambda library in this example. | ||||
|  | ||||
|   int x[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; | ||||
|   const int N = sizeof(x)/sizeof(int); | ||||
|  | ||||
|   typedef boost::binder1st< std::multiplies<int> > Function; | ||||
|   typedef boost::transform_iterator<Function, int*> doubling_iterator; | ||||
|  | ||||
|   doubling_iterator i(x, boost::bind1st(std::multiplies<int>(), 2)), | ||||
|     i_end(x + N, boost::bind1st(std::multiplies<int>(), 2)); | ||||
|  | ||||
|   std::cout << "multiplying the array by 2:" << std::endl; | ||||
|   while (i != i_end) | ||||
|     std::cout << *i++ << " "; | ||||
|   std::cout << std::endl; | ||||
|  | ||||
|   std::cout << "adding 4 to each element in the array:" << std::endl; | ||||
|  | ||||
|   std::copy(boost::make_transform_iterator(x, boost::bind1st(std::plus<int>(), 4)), | ||||
|             boost::make_transform_iterator(x + N, boost::bind1st(std::plus<int>(), 4)), | ||||
|             std::ostream_iterator<int>(std::cout, " ")); | ||||
|   std::cout << std::endl; | ||||
|    | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
|  | ||||
| @@ -65,25 +65,27 @@ void test ( T const& y, T const& z ) | ||||
| { | ||||
|   boost::value_initialized<T> x ; | ||||
|   BOOST_TEST ( y == x ) ; | ||||
|   BOOST_TEST ( y == get(x) ) ; | ||||
|   BOOST_TEST ( y == boost::get(x) ) ; | ||||
|   static_cast<T&>(x) = z ; | ||||
|   get(x) = z ; | ||||
|   boost::get(x) = z ; | ||||
|   BOOST_TEST ( x == z ) ; | ||||
|  | ||||
|   boost::value_initialized<T> const x_c ; | ||||
|   BOOST_TEST ( y == x_c ) ; | ||||
|   BOOST_TEST ( y == get(x_c) ) ; | ||||
|   BOOST_TEST ( y == boost::get(x_c) ) ; | ||||
|   T& x_c_ref = x_c ; | ||||
|   x_c_ref = z ; | ||||
|   BOOST_TEST ( x_c == z ) ; | ||||
|  | ||||
| #if !BOOST_WORKAROUND(BOOST_MSVC, < 1300) | ||||
|   boost::value_initialized<T const> cx ; | ||||
|   BOOST_TEST ( y == cx ) ; | ||||
|   BOOST_TEST ( y == get(cx) ) ; | ||||
|   BOOST_TEST ( y == boost::get(cx) ) ; | ||||
|  | ||||
|   boost::value_initialized<T const> const cx_c ; | ||||
|   BOOST_TEST ( y == cx_c ) ; | ||||
|   BOOST_TEST ( y == get(cx_c) ) ; | ||||
|   BOOST_TEST ( y == boost::get(cx_c) ) ; | ||||
| #endif | ||||
| } | ||||
|  | ||||
| int test_main(int, char **) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user