CbcPointer(); // a nil pointer
CbcPointer(Cbc *aCbc);
CbcPointer(const CbcPointer &p);
+ CbcPointer(CbcPointer &&);
~CbcPointer();
Cbc *raw() const; ///< a temporary raw Cbc pointer; may be invalid
bool operator ==(const CbcPointer<Cbc> &o) const { return lock == o.lock; }
CbcPointer &operator =(const CbcPointer &p);
+ CbcPointer &operator =(CbcPointer &&);
/// support converting a child cbc pointer into a parent cbc pointer
template <typename Other>
lock = cbdataReference(d.lock);
}
+template<class Cbc>
+CbcPointer<Cbc>::CbcPointer(CbcPointer &&d): cbc(d.cbc), lock(d.lock)
+{
+ d.cbc = nullptr;
+ d.lock = nullptr;
+}
+
template<class Cbc>
CbcPointer<Cbc>::~CbcPointer()
{
return *this;
}
+template<class Cbc>
+CbcPointer<Cbc> &CbcPointer<Cbc>::operator =(CbcPointer &&d)
+{
+ if (this != &d) { // assignment to self
+ clear();
+ cbc = d.cbc;
+ d.cbc = nullptr;
+ lock = d.lock;
+ d.lock = nullptr;
+ }
+ return *this;
+}
+
template<class Cbc>
void
CbcPointer<Cbc>::clear()
memset(®ex, 0, sizeof(regex));
}
+RegexPattern::RegexPattern(RegexPattern &&o) :
+ flags(std::move(o.flags)), // does o.flags=0
+ regex(std::move(o.regex)),
+ pattern(std::move(o.pattern))
+{
+ memset(&o.regex, 0, sizeof(o.regex));
+ o.pattern = nullptr;
+}
+
RegexPattern::~RegexPattern()
{
xfree(pattern);
regfree(®ex);
}
+RegexPattern &
+RegexPattern::operator =(RegexPattern &&o)
+{
+ flags = std::move(o.flags); // does o.flags=0
+ regex = std::move(o.regex);
+ memset(&o.regex, 0, sizeof(o.regex));
+ pattern = std::move(o.pattern);
+ o.pattern = nullptr;
+ return *this;
+}
public:
RegexPattern() = delete;
RegexPattern(int aFlags, const char *aPattern);
- RegexPattern(const RegexPattern &) = delete;
- RegexPattern(RegexPattern &&) = default;
~RegexPattern();
+ // regex type varies by library, usually not safe to copy
+ RegexPattern(const RegexPattern &) = delete;
+ RegexPattern &operator =(const RegexPattern &) = delete;
+
+ RegexPattern(RegexPattern &&);
+ RegexPattern &operator =(RegexPattern &&);
+
const char * c_str() const {return pattern;}
bool match(const char *str) const {return regexec(®ex,str,0,NULL,0)==0;}
return *this;
}
- // move semantics are definitely okay, when possible
- explicit LockingPointer(SelfType &&) = default;
+ LockingPointer(SelfType &&o) : raw(nullptr) {
+ resetWithoutLocking(o.release());
+ }
SelfType &operator =(SelfType &&o) {
if (o.get() != raw)
resetWithoutLocking(o.release());