27 const unsigned NOFLAGS = 0x00;
28 const unsigned REF = 0x01;
29 const unsigned LOCKED = 0x02;
30 const unsigned CONSTREF = 0x04;
31 const unsigned TMP = 0x08;
32 const unsigned LAST = 0x10;
45 : flags(flags_p), p(t), count(std::make_shared<long>(1)) { }
46 cow_ptr(
unsigned flags_p, std::shared_ptr<T> tp)
47 : flags(flags_p), p(tp), count(std::make_shared<long>(1)) { }
53 const T* operator->()
const {
56 const T& operator*()
const {
63 throw std::range_error(
"cannot modify const object");
68 throw std::range_error(
"cannot copy locked object");
71 p = std::make_shared<T>(*p);
73 count = std::make_shared<long>(1);
80 throw std::range_error(
"cannot modify const object");
84 throw std::range_error(
"cannot copy locked object");
87 p = std::make_shared<T>(*p);
89 count = std::make_shared<long>(1);
96 T*
get() {
return p.get(); }
99 const T*
get()
const {
return p.get(); }
104 flags = o.flags & ~LAST;
106 if (!(flags & CONSTREF))
111 cow_ptr(
const cow_ptr& o)
112 : flags(o.flags & ~LAST), p(o.p), count(o.count) { ++*count; }
114 bool isRef()
const {
return flags & REF; }
115 bool isLocked()
const {
return flags & LOCKED; }
116 bool isConst()
const {
return flags & CONSTREF; }
117 bool isTmp()
const {
return flags & TMP; }
118 bool isLast()
const {
return flags & LAST; }
120 void setTmp() { flags |= TMP; --*count; }
121 void setRef() { flags |= REF; }
122 void setLock() { flags |= LOCKED; }
123 void setConst() { flags |= CONSTREF; }
125 flags |= LAST; --*count;
128 void resetTmp() { flags &= ~TMP; }
129 void resetLock() { flags &= ~LOCKED; }
130 void resetRef() { flags &= ~REF; }
132 unsigned getFlags()
const {
return flags; }
134 long use_count()
const {
return *count; }
137 if (!isLast() && !isTmp()) {
144 std::shared_ptr<T> p;
145 std::shared_ptr<long> count;
149 template <
typename T,
typename... Args>
150 inline cow_ptr<T> make_cow(
unsigned flags, Args&&... args)
152 return cow_ptr<T>(flags,
new T(std::forward<Args>(args)...));