CUBRID Engine  latest
memory_reference_store.hpp
Go to the documentation of this file.
1 /*
2  * Copyright 2008 Search Solution Corporation
3  * Copyright 2016 CUBRID Corporation
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  */
18 
19 //
20 // memory_reference_store.hpp - extension to handle permanent & temporary ownership
21 //
22 
23 #ifndef _MEMORY_REFERENCE_STORE_HPP_
24 #define _MEMORY_REFERENCE_STORE_HPP_
25 
26 #include <algorithm>
27 
28 namespace cubmem
29 {
30  template <typename T>
32  {
33  public:
34  reference_store ();
36 
37  reference_store (reference_store &) = delete;
39 
40  const T *get_immutable () const;
41  bool is_null () const;
42  bool is_mutable () const;
43  T *get_mutable () const;
45 
47  void set_immutable_reference (T *ptr);
48  void set_mutable_reference (T *ptr);
49 
50  void clear ();
52  private:
53  void delete_mutable ();
54 
57  };
58 }
59 
60 namespace cubmem
61 {
62  template <class T>
64  : m_immutable_reference (nullptr)
65  , m_mutable_reference (nullptr)
66  {
67 
68  }
69 
70  template <class T>
73  {
74  if (this != &other)
75  {
76  std::swap (m_mutable_reference, other.m_mutable_reference);
77  std::swap (m_immutable_reference, other.m_immutable_reference);
78  }
79  return *this;
80  }
81 
82  template <class T>
83  const T *
85  {
86  return m_immutable_reference;
87  }
88 
89  template <class T>
90  bool
92  {
93  return m_immutable_reference == nullptr;
94  }
95 
96  template <class T>
97  bool
99  {
100  return m_mutable_reference != nullptr;
101  }
102 
103  template <class T>
104  T *
106  {
107  assert (is_mutable ());
108  return m_mutable_reference;
109  }
110 
111  template <class T>
112  T *
114  {
115  assert (is_mutable ());
116  T *ret_ref = m_mutable_reference;
118  return ret_ref;
119  }
120 
121  template <class T>
122  void
124  {
125  if (ptr != m_mutable_reference)
126  {
127  // we should not clear the doc we assign to ourselves
128  clear ();
129  }
130 
131  m_mutable_reference = nullptr;
132  m_immutable_reference = ptr;
133  }
134 
135  template <class T>
136  void
138  {
139  if (ptr != m_mutable_reference)
140  {
141  clear ();
143  }
144  }
145 
146  template <class T>
147  void
149  {
150  if (is_mutable ())
151  {
152  delete_mutable ();
153  m_mutable_reference = nullptr;
154  }
155  m_immutable_reference = nullptr;
156  }
157 
158  template <class T>
160  {
161  clear ();
162  }
163 }
164 
165 #endif // _MEMORY_REFERENCE_STORE_HPP_
reference_store & operator=(reference_store &&)
#define assert(x)