Blame view

3rdparty/boost_1_81_0/boost/iostreams/detail/optional.hpp 3.21 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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
  // (C) Copyright 2008 CodeRage, LLC (turkanis at coderage dot com)
  // (C) Copyright 2005-2007 Jonathan Turkanis
  // 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/libs/iostreams for documentation.
  
  // Recent changes to Boost.Optional involving assigment broke Boost.Iostreams,
  // in a way which could be remedied only by relying on the deprecated reset
  // functions; with VC6, even reset didn't work. Until this problem is 
  // understood, Iostreams will use a private version of optional with a smart 
  // pointer interface.
  
  #ifndef BOOST_IOSTREAMS_DETAIL_OPTIONAL_HPP_INCLUDED
  #define BOOST_IOSTREAMS_DETAIL_OPTIONAL_HPP_INCLUDED
  
  #if defined(_MSC_VER)
  # pragma once
  #endif
  
  #include <boost/assert.hpp>
  #include <boost/mpl/int.hpp>
  #include <boost/type_traits/aligned_storage.hpp>
  #include <boost/type_traits/alignment_of.hpp>
  
  namespace boost { namespace iostreams { namespace detail {
  
  // Taken from <boost/optional.hpp>.
  template<class T>
  class aligned_storage
  {
      // Borland ICEs if unnamed unions are used for this!
      union dummy_u
      {
          char data[ sizeof(T) ];
          BOOST_DEDUCED_TYPENAME type_with_alignment<
            ::boost::alignment_of<T>::value >::type aligner_;
      } dummy_ ;
  
    public:
  
      void const* address() const { return &dummy_.data[0]; }
      void      * address()       { return &dummy_.data[0]; }
  };
  
  template<typename T>
  class optional {
  public:
      typedef T element_type;
      optional() : initialized_(false) { }
      optional(const T& t) : initialized_(false) { reset(t); }
      ~optional() { reset(); }
      T& operator*() 
      { 
          BOOST_ASSERT(initialized_);
          return *static_cast<T*>(address()); 
      }
      const T& operator*() const
      { 
          BOOST_ASSERT(initialized_);
          return *static_cast<const T*>(address()); 
      }
      T* operator->() 
      { 
          BOOST_ASSERT(initialized_);
          return static_cast<T*>(address()); 
      }
      const T* operator->() const
      { 
          BOOST_ASSERT(initialized_);
          return static_cast<const T*>(address()); 
      }
      T* get() 
      { 
          BOOST_ASSERT(initialized_);
          return static_cast<T*>(address()); 
      }
      const T* get() const
      { 
          BOOST_ASSERT(initialized_);
          return static_cast<const T*>(address()); 
      }
      void reset() 
      {
          if (initialized_) { 
          #if BOOST_WORKAROUND(BOOST_BORLANDC, BOOST_TESTED_AT(0x564)) || \
              BOOST_WORKAROUND(__IBMCPP__, BOOST_TESTED_AT(600)) \
              /**/
              T* t = static_cast<T*>(address());
              t->~T();
          #else
              static_cast<T*>(address())->T::~T();
          #endif
              initialized_ = false;
          }
      }
      void reset(const T& t) 
      {
          reset();
          new (address()) T(t); 
          initialized_ = true;
      }
  private:
      optional(const optional&);
      optional& operator=(const optional&);
      void* address() { return &storage_; }
      const void* address() const { return &storage_; }
      aligned_storage<T>  storage_;
      bool                initialized_;
  };
  
  } } } // End namespaces detail, iostreams, boost.
  
  #endif // #ifndef BOOST_IOSTREAMS_DETAIL_OPTIONAL_HPP_INCLUDED