Blame view

3rdparty/boost_1_81_0/boost/detail/identifier.hpp 3.1 KB
63e88f80   Hu Chunming   提交三方库
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
  //  boost/identifier.hpp  ----------------------------------------------------//
  
  //  Copyright Beman Dawes 2006
  
  //  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 documentation at http://www.boost.org/libs/utility
  
  #ifndef BOOST_IDENTIFIER_HPP
  #define BOOST_IDENTIFIER_HPP
  
  #include <boost/utility/enable_if.hpp>
  #include <boost/type_traits/is_base_of.hpp>
  #include <iosfwd>
  
  namespace boost
  {
    namespace detail
    {
      //  class template identifier  ---------------------------------------------//
  
      //  Always used as a base class so that different instantiations result in
      //  different class types even if instantiated with the same value type T.
  
      //  Expected usage is that T is often an integer type, best passed by
      //  value. There is no reason why T can't be a possibly larger class such as
      //  std::string, best passed by const reference.
  
      //  This implementation uses pass by value, based on expected common uses.
  
      template <typename T, typename D>
      class identifier
      {
      public:
        typedef T value_type;
  
        const value_type value() const           { return m_value; }
        void  assign( value_type v )             { m_value = v; }
  
        bool operator==( const D & rhs ) const   { return m_value == rhs.m_value; }
        bool operator!=( const D & rhs ) const   { return m_value != rhs.m_value; }
        bool operator< ( const D & rhs ) const   { return m_value <  rhs.m_value; }
        bool operator<=( const D & rhs ) const   { return m_value <= rhs.m_value; }
        bool operator> ( const D & rhs ) const   { return m_value >  rhs.m_value; }
        bool operator>=( const D & rhs ) const   { return m_value >= rhs.m_value; }
  
        typedef void (*unspecified_bool_type)(D); // without the D, unspecified_bool_type 
        static void unspecified_bool_true(D){}    // conversion allows relational operators
                                                  // between different identifier types
  
        operator unspecified_bool_type() const   { return m_value == value_type() ? 0 : unspecified_bool_true; }
        bool operator!() const                   { return m_value == value_type(); }
  
      // constructors are protected so that class can only be used as a base class
      protected:
        identifier()                             {}
        explicit identifier( value_type v )      : m_value(v) {}
  
      private:
        T m_value;
      };
  
    //#ifndef BOOST_NO_SFINAE
  
    //  template <class Ostream, class Id>
    //    typename enable_if< is_base_of< identifier< typename Id::value_type, Id >, Id >, 
    //      Ostream & >::type operator<<( Ostream & os, const Id & id )
    //  {
    //    return os << id.value();
    //  }
  
    //  template <class Istream, class Id>
    //    typename enable_if< is_base_of< identifier< typename Id::value_type, Id >, Id >, 
    //      Istream & >::type operator>>( Istream & is, Id & id )
    //  {
    //    typename Id::value_type v;
    //    is >> v;
    //    id.value( v );
    //    return is;
    //  }
    //#endif
  
    } // namespace detail
  } // namespace boost
  
  #endif // BOOST_IDENTIFIER_HPP