00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #ifndef OR_TOOLS_BASE_SCOPED_PTR_H_
00015 #define OR_TOOLS_BASE_SCOPED_PTR_H_
00016
00017
00018
00019
00020
00021 #include <assert.h>
00022 #include <stdlib.h>
00023
00024 #include <algorithm>
00025 #include <cstddef>
00026
00027 #include "base/basictypes.h"
00028 #include "base/macros.h"
00029
00030 namespace operations_research {
00031
00032 template <class C> class scoped_ptr;
00033 template <class C, class Free> class scoped_ptr_malloc;
00034 template <class C> class scoped_array;
00035
00036 template <class C>
00037 scoped_ptr<C> make_scoped_ptr(C * param);
00038
00039
00040
00041
00042
00043
00044
00045
00046 template <class C>
00047 class scoped_ptr {
00048 public:
00049
00050
00051 typedef C element_type;
00052
00053
00054
00055
00056 explicit scoped_ptr(C* p = NULL) : ptr_(p) { }
00057
00058
00059
00060 ~scoped_ptr() {
00061 enum { type_must_be_complete = sizeof(C) };
00062 delete ptr_;
00063 }
00064
00065
00066
00067
00068 void reset(C* p = NULL) {
00069 if (p != ptr_) {
00070 enum { type_must_be_complete = sizeof(C) };
00071 delete ptr_;
00072 ptr_ = p;
00073 }
00074 }
00075
00076
00077
00078 C& operator*() const {
00079 assert(ptr_ != NULL);
00080 return *ptr_;
00081 }
00082 C* operator->() const {
00083 assert(ptr_ != NULL);
00084 return ptr_;
00085 }
00086 C* get() const { return ptr_; }
00087
00088
00089
00090
00091 bool operator==(C* p) const { return ptr_ == p; }
00092 bool operator!=(C* p) const { return ptr_ != p; }
00093
00094
00095 void swap(scoped_ptr& p2) {
00096 C* tmp = ptr_;
00097 ptr_ = p2.ptr_;
00098 p2.ptr_ = tmp;
00099 }
00100
00101
00102
00103
00104
00105
00106 C* release() {
00107 C* retVal = ptr_;
00108 ptr_ = NULL;
00109 return retVal;
00110 }
00111
00112 private:
00113 C* ptr_;
00114
00115
00116
00117 friend scoped_ptr<C> make_scoped_ptr<C>(C *p);
00118
00119
00120
00121
00122 template <class C2> bool operator==(scoped_ptr<C2> const& p2) const;
00123 template <class C2> bool operator!=(scoped_ptr<C2> const& p2) const;
00124
00125 DISALLOW_COPY_AND_ASSIGN(scoped_ptr);
00126 };
00127
00128
00129 template <class C>
00130 void swap(scoped_ptr<C>& p1, scoped_ptr<C>& p2) {
00131 p1.swap(p2);
00132 }
00133
00134 template <class C>
00135 bool operator==(C* p1, const scoped_ptr<C>& p2) {
00136 return p1 == p2.get();
00137 }
00138
00139 template <class C>
00140 bool operator!=(C* p1, const scoped_ptr<C>& p2) {
00141 return p1 != p2.get();
00142 }
00143
00144 template <class C>
00145 scoped_ptr<C> make_scoped_ptr(C *p) {
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155 return scoped_ptr<C>(p);
00156 }
00157
00158
00159
00160
00161
00162
00163
00164
00165 template <class C>
00166 class scoped_array {
00167 public:
00168
00169
00170 typedef C element_type;
00171
00172
00173
00174
00175 explicit scoped_array(C* p = NULL) : array_(p) { }
00176
00177
00178
00179 ~scoped_array() {
00180 enum { type_must_be_complete = sizeof(C) };
00181 delete[] array_;
00182 }
00183
00184
00185
00186
00187 void reset(C* p = NULL) {
00188 if (p != array_) {
00189 enum { type_must_be_complete = sizeof(C) };
00190 delete[] array_;
00191 array_ = p;
00192 }
00193 }
00194
00195
00196
00197 C& operator[](std::ptrdiff_t i) const {
00198 assert(i >= 0);
00199 assert(array_ != NULL);
00200 return array_[i];
00201 }
00202
00203
00204
00205 C* get() const {
00206 return array_;
00207 }
00208
00209
00210
00211
00212 bool operator==(C* p) const { return array_ == p; }
00213 bool operator!=(C* p) const { return array_ != p; }
00214
00215
00216 void swap(scoped_array& p2) {
00217 C* tmp = array_;
00218 array_ = p2.array_;
00219 p2.array_ = tmp;
00220 }
00221
00222
00223
00224
00225
00226
00227 C* release() {
00228 C* retVal = array_;
00229 array_ = NULL;
00230 return retVal;
00231 }
00232
00233 private:
00234 C* array_;
00235
00236
00237 template <class C2> bool operator==(scoped_array<C2> const& p2) const;
00238 template <class C2> bool operator!=(scoped_array<C2> const& p2) const;
00239
00240 DISALLOW_COPY_AND_ASSIGN(scoped_array);
00241 };
00242
00243
00244 template <class C>
00245 void swap(scoped_array<C>& p1, scoped_array<C>& p2) {
00246 p1.swap(p2);
00247 }
00248
00249 template <class C>
00250 bool operator==(C* p1, const scoped_array<C>& p2) {
00251 return p1 == p2.get();
00252 }
00253
00254 template <class C>
00255 bool operator!=(C* p1, const scoped_array<C>& p2) {
00256 return p1 != p2.get();
00257 }
00258
00259
00260
00261 class ScopedPtrMallocFree {
00262 public:
00263 inline void operator()(void* x) const {
00264 free(x);
00265 }
00266 };
00267
00268
00269
00270
00271 template<class C, class FreeProc = ScopedPtrMallocFree>
00272 class scoped_ptr_malloc {
00273 public:
00274
00275
00276 typedef C element_type;
00277
00278
00279
00280
00281
00282
00283 explicit scoped_ptr_malloc(C* p = NULL): ptr_(p) {}
00284
00285
00286 ~scoped_ptr_malloc() {
00287 free_(ptr_);
00288 }
00289
00290
00291
00292
00293 void reset(C* p = NULL) {
00294 if (ptr_ != p) {
00295 free_(ptr_);
00296 ptr_ = p;
00297 }
00298 }
00299
00300
00301
00302
00303 C& operator*() const {
00304 assert(ptr_ != NULL);
00305 return *ptr_;
00306 }
00307
00308 C* operator->() const {
00309 assert(ptr_ != NULL);
00310 return ptr_;
00311 }
00312
00313 C* get() const {
00314 return ptr_;
00315 }
00316
00317
00318
00319
00320
00321
00322 bool operator==(C* p) const {
00323 return ptr_ == p;
00324 }
00325
00326 bool operator!=(C* p) const {
00327 return ptr_ != p;
00328 }
00329
00330
00331 void swap(scoped_ptr_malloc & b) {
00332 C* tmp = b.ptr_;
00333 b.ptr_ = ptr_;
00334 ptr_ = tmp;
00335 }
00336
00337
00338
00339
00340
00341
00342 C* release() {
00343 C* tmp = ptr_;
00344 ptr_ = NULL;
00345 return tmp;
00346 }
00347
00348 private:
00349 C* ptr_;
00350
00351
00352 template <class C2, class GP>
00353 bool operator==(scoped_ptr_malloc<C2, GP> const& p) const;
00354 template <class C2, class GP>
00355 bool operator!=(scoped_ptr_malloc<C2, GP> const& p) const;
00356
00357 static FreeProc const free_;
00358
00359 DISALLOW_COPY_AND_ASSIGN(scoped_ptr_malloc);
00360 };
00361
00362 template<class C, class FP>
00363 FP const scoped_ptr_malloc<C, FP>::free_ = FP();
00364
00365 template<class C, class FP> inline
00366 void swap(scoped_ptr_malloc<C, FP>& a, scoped_ptr_malloc<C, FP>& b) {
00367 a.swap(b);
00368 }
00369
00370 template<class C, class FP> inline
00371 bool operator==(C* p, const scoped_ptr_malloc<C, FP>& b) {
00372 return p == b.get();
00373 }
00374
00375 template<class C, class FP> inline
00376 bool operator!=(C* p, const scoped_ptr_malloc<C, FP>& b) {
00377 return p != b.get();
00378 }
00379 }
00380
00381 #endif // OR_TOOLS_BASE_SCOPED_PTR_H_