is_lvalue_iterator.cpp

来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 146 行

CPP
146
字号
// 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 <deque>#include <iterator>#include <iostream>#include <boost/static_assert.hpp>#include <boost/noncopyable.hpp>#include <boost/type_traits/broken_compiler_spec.hpp>#include <boost/iterator/is_lvalue_iterator.hpp>#include <boost/iterator.hpp>// Last, for BOOST_NO_LVALUE_RETURN_DETECTION#include <boost/iterator/detail/config_def.hpp>struct v{    v();    ~v();};BOOST_TT_BROKEN_COMPILER_SPEC(v)struct value_iterator : boost::iterator<std::input_iterator_tag,v>{    v operator*() const;};struct noncopyable_iterator : boost::iterator<std::forward_iterator_tag,boost::noncopyable>{    boost::noncopyable const& operator*() const;};template <class T>struct proxy_iterator  : boost::iterator<std::output_iterator_tag,T>{    typedef T value_type;    #if BOOST_WORKAROUND(__GNUC__, == 2)    typedef boost::iterator<std::input_iterator_tag,value_type> base;    typedef base::iterator_category iterator_category;    typedef base::difference_type difference_type;    typedef base::pointer pointer;    typedef base::reference reference;#endif         struct proxy    {        operator value_type&() const;        proxy& operator=(value_type) const;    };            proxy operator*() const;};template <class T>struct lvalue_iterator{    typedef T value_type;    typedef T& reference;    typedef T difference_type;    typedef std::input_iterator_tag iterator_category;    typedef T* pointer;    T& operator*() const;    lvalue_iterator& operator++();    lvalue_iterator operator++(int);};template <class T>struct constant_lvalue_iterator{    typedef T value_type;    typedef T const& reference;    typedef T difference_type;    typedef std::input_iterator_tag iterator_category;    typedef T const* pointer;    T const& operator*() const;    constant_lvalue_iterator& operator++();    constant_lvalue_iterator operator++(int);};BOOST_TT_BROKEN_COMPILER_SPEC(proxy_iterator<v>::proxy)BOOST_TT_BROKEN_COMPILER_SPEC(proxy_iterator<int>::proxy)int main(){    BOOST_STATIC_ASSERT(boost::is_lvalue_iterator<v*>::value);    BOOST_STATIC_ASSERT(boost::is_lvalue_iterator<v const*>::value);    BOOST_STATIC_ASSERT(boost::is_lvalue_iterator<std::deque<v>::iterator>::value);    BOOST_STATIC_ASSERT(boost::is_lvalue_iterator<std::deque<v>::const_iterator>::value);    BOOST_STATIC_ASSERT(!boost::is_lvalue_iterator<std::back_insert_iterator<std::deque<v> > >::value);    BOOST_STATIC_ASSERT(!boost::is_lvalue_iterator<std::ostream_iterator<v> >::value);    BOOST_STATIC_ASSERT(!boost::is_lvalue_iterator<proxy_iterator<v> >::value);    BOOST_STATIC_ASSERT(!boost::is_lvalue_iterator<proxy_iterator<int> >::value);#ifndef BOOST_NO_LVALUE_RETURN_DETECTION    BOOST_STATIC_ASSERT(!boost::is_lvalue_iterator<value_iterator>::value);#endif    // Make sure inaccessible copy constructor doesn't prevent    // reference binding    BOOST_STATIC_ASSERT(boost::is_lvalue_iterator<noncopyable_iterator>::value);    BOOST_STATIC_ASSERT(boost::is_lvalue_iterator<lvalue_iterator<v> >::value);    BOOST_STATIC_ASSERT(boost::is_lvalue_iterator<lvalue_iterator<int> >::value);    BOOST_STATIC_ASSERT(boost::is_lvalue_iterator<lvalue_iterator<char*> >::value);    BOOST_STATIC_ASSERT(boost::is_lvalue_iterator<lvalue_iterator<float> >::value);        BOOST_STATIC_ASSERT(boost::is_lvalue_iterator<constant_lvalue_iterator<v> >::value);    BOOST_STATIC_ASSERT(boost::is_lvalue_iterator<constant_lvalue_iterator<int> >::value);    BOOST_STATIC_ASSERT(boost::is_lvalue_iterator<constant_lvalue_iterator<char*> >::value);    BOOST_STATIC_ASSERT(boost::is_lvalue_iterator<constant_lvalue_iterator<float> >::value);            BOOST_STATIC_ASSERT(boost::is_non_const_lvalue_iterator<v*>::value);    BOOST_STATIC_ASSERT(!boost::is_non_const_lvalue_iterator<v const*>::value);    BOOST_STATIC_ASSERT(boost::is_non_const_lvalue_iterator<std::deque<v>::iterator>::value);    BOOST_STATIC_ASSERT(!boost::is_non_const_lvalue_iterator<std::deque<v>::const_iterator>::value);    BOOST_STATIC_ASSERT(!boost::is_non_const_lvalue_iterator<std::back_insert_iterator<std::deque<v> > >::value);    BOOST_STATIC_ASSERT(!boost::is_non_const_lvalue_iterator<std::ostream_iterator<v> >::value);    BOOST_STATIC_ASSERT(!boost::is_non_const_lvalue_iterator<proxy_iterator<v> >::value);    BOOST_STATIC_ASSERT(!boost::is_non_const_lvalue_iterator<proxy_iterator<int> >::value);#ifndef BOOST_NO_LVALUE_RETURN_DETECTION    BOOST_STATIC_ASSERT(!boost::is_non_const_lvalue_iterator<value_iterator>::value);#endif    BOOST_STATIC_ASSERT(!boost::is_non_const_lvalue_iterator<noncopyable_iterator>::value);        BOOST_STATIC_ASSERT(boost::is_non_const_lvalue_iterator<lvalue_iterator<v> >::value);#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))    BOOST_STATIC_ASSERT(boost::is_non_const_lvalue_iterator<lvalue_iterator<int> >::value);#endif     BOOST_STATIC_ASSERT(boost::is_non_const_lvalue_iterator<lvalue_iterator<char*> >::value);    BOOST_STATIC_ASSERT(boost::is_non_const_lvalue_iterator<lvalue_iterator<float> >::value);        BOOST_STATIC_ASSERT(!boost::is_non_const_lvalue_iterator<constant_lvalue_iterator<v> >::value);    BOOST_STATIC_ASSERT(!boost::is_non_const_lvalue_iterator<constant_lvalue_iterator<int> >::value);    BOOST_STATIC_ASSERT(!boost::is_non_const_lvalue_iterator<constant_lvalue_iterator<char*> >::value);    BOOST_STATIC_ASSERT(!boost::is_non_const_lvalue_iterator<constant_lvalue_iterator<float> >::value);        return 0;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?