|
|
|
@ -44,49 +44,49 @@ namespace pEp {
|
|
|
|
|
{
|
|
|
|
|
_nodename = rhs._nodename;
|
|
|
|
|
_parent = nullptr;
|
|
|
|
|
_cloneChildRefs(rhs);
|
|
|
|
|
_copyChildRefs(rhs);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template<class T>
|
|
|
|
|
PityTree<T>& PityTree<T>::operator=(const PityTree<T>& rhs) {
|
|
|
|
|
PityTree<T>& PityTree<T>::operator=(const PityTree<T>& rhs)
|
|
|
|
|
{
|
|
|
|
|
_nodename = rhs._nodename;
|
|
|
|
|
_parent = nullptr;
|
|
|
|
|
_cloneChildRefs(rhs);
|
|
|
|
|
_copyChildRefs(rhs);
|
|
|
|
|
return *this;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template<class T>
|
|
|
|
|
T& PityTree<T>::addRef(T& node)
|
|
|
|
|
{
|
|
|
|
|
node.setParent(&_self);
|
|
|
|
|
_childrefs.insert(ChildRef(node.getName(), node));
|
|
|
|
|
return node;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
template<typename T>
|
|
|
|
|
template<typename... Args>
|
|
|
|
|
T& PityTree<T>::addNew(Args&&... args)
|
|
|
|
|
template<typename CT, typename... Args>
|
|
|
|
|
CT& PityTree<T>::addNew(Args&&... args)
|
|
|
|
|
{
|
|
|
|
|
_childobjs.push_back(ChildObj(new T(std::forward<Args>(args)...)));
|
|
|
|
|
T& ret = *_childobjs.back().get();
|
|
|
|
|
addRef(ret);
|
|
|
|
|
return ret;
|
|
|
|
|
static_assert(std::is_base_of<T, CT>::value, "T must be base of CT");
|
|
|
|
|
std::shared_ptr<CT> tmp = std::make_shared<CT>(std::forward<Args>(args)...);
|
|
|
|
|
_childobjs.push_back(tmp);
|
|
|
|
|
addRef(*tmp.get());
|
|
|
|
|
return *tmp.get();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
template<typename T>
|
|
|
|
|
template<typename CT>
|
|
|
|
|
T& PityTree<T>::addCopy(const CT&& t, const std::string& new_name)
|
|
|
|
|
CT& PityTree<T>::addCopy(const CT&& child, const std::string& new_name)
|
|
|
|
|
{
|
|
|
|
|
static_assert(std::is_base_of<T, CT>::value, "PityTree<T> must be a base of T");
|
|
|
|
|
_childobjs.push_back(ChildObj(new CT(t)));
|
|
|
|
|
T& ret = *_childobjs.back().get();
|
|
|
|
|
CT* tmpraw = new CT(child);
|
|
|
|
|
_childobjs.push_back(ChildObj(tmpraw));
|
|
|
|
|
if (new_name != "") {
|
|
|
|
|
ret.setName(new_name);
|
|
|
|
|
tmpraw->setName(new_name);
|
|
|
|
|
}
|
|
|
|
|
addRef(ret);
|
|
|
|
|
return ret;
|
|
|
|
|
addRef(*tmpraw);
|
|
|
|
|
return *tmpraw;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template<class T>
|
|
|
|
|
T& PityTree<T>::addRef(T& child)
|
|
|
|
|
{
|
|
|
|
|
child.setParent(&_self);
|
|
|
|
|
_childrefs.insert(ChildRef(child.getName(), child));
|
|
|
|
|
return child;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template<class T>
|
|
|
|
@ -203,7 +203,8 @@ namespace pEp {
|
|
|
|
|
// When you copy a treenode, you need to create a copy of all children
|
|
|
|
|
// and take ownership
|
|
|
|
|
template<class T>
|
|
|
|
|
void PityTree<T>::_cloneChildRefs(const PityTree<T>& rhs) {
|
|
|
|
|
void PityTree<T>::_copyChildRefs(const PityTree<T>& rhs)
|
|
|
|
|
{
|
|
|
|
|
for (const ChildRef& cr : rhs.getChildRefs()) {
|
|
|
|
|
_childobjs.push_back(ChildObj(cr.second.clone()));
|
|
|
|
|
T& ret = *_childobjs.back().get();
|
|
|
|
|