@ -49,18 +49,18 @@ namespace pEp {
//
//
template < typename T >
template < typename T >
template < typename CT , typename . . . Args >
template < typename CT , typename . . . Args >
CT & PityTree < T > : : addNew ( Args & & . . . args )
CT * PityTree < T > : : addNew ( Args & & . . . args )
{
{
static_assert ( std : : is_base_of < T , CT > : : value , " T must be base of CT " ) ;
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 ) . . . ) ;
std : : shared_ptr < CT > tmp = std : : make_shared < CT > ( std : : forward < Args > ( args ) . . . ) ;
_childobjs . push _back( tmp ) ;
_childobjs . emplace _back( tmp ) ;
addRef ( * tmp . get ( ) ) ;
addRef ( * tmp ) ;
return * tmp . get ( ) ;
return tmp . get ( ) ;
}
}
template < typename T >
template < typename T >
template < typename CT >
template < typename CT >
CT & PityTree < T > : : addCopy ( const CT & & child , 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 " ) ;
static_assert ( std : : is_base_of < T , CT > : : value , " PityTree<T> must be a base of T " ) ;
CT * tmpraw = new CT ( child ) ;
CT * tmpraw = new CT ( child ) ;
@ -69,22 +69,22 @@ namespace pEp {
tmpraw - > setName ( new_name ) ;
tmpraw - > setName ( new_name ) ;
}
}
addRef ( * tmpraw ) ;
addRef ( * tmpraw ) ;
return * tmpraw ;
return tmpraw ;
}
}
template < typename T >
template < typename T >
template < typename CT >
template < typename CT >
CT & PityTree < T > : : addCopy ( const CT & child , const std : : string & new_name )
CT * PityTree < T > : : addCopy ( const CT & child , const std : : string & new_name )
{
{
return addCopy ( std : : move ( child ) ) ;
return addCopy ( std : : move ( child ) ) ;
}
}
template < class T >
template < class T >
T & PityTree < T > : : addRef ( T & child )
T * PityTree < T > : : addRef ( T & child )
{
{
child . setParent ( & _self ) ;
child . setParent ( & _self ) ;
_childrefs . insert ( ChildRef ( child . getName ( ) , child ) ) ;
_childrefs . insert ( ChildRef ( child . getName ( ) , child ) ) ;
return child ;
return & child ;
}
}
template < class T >
template < class T >
@ -157,12 +157,12 @@ namespace pEp {
}
}
template < class T >
template < class T >
T & PityTree < T > : : getRoot ( )
T * PityTree < T > : : getRoot ( )
{
{
if ( ! isRoot ( ) ) {
if ( ! isRoot ( ) ) {
return _parent - > getRoot ( ) ;
return _parent - > getRoot ( ) ;
} else {
} else {
return _self ;
return & _self ;
}
}
}
}
@ -173,7 +173,7 @@ namespace pEp {
}
}
template < class T >
template < class T >
T & PityTree < T > : : getChild ( const std : : string & name )
T * PityTree < T > : : getChild ( const std : : string & name )
{
{
T * ret = nullptr ;
T * ret = nullptr ;
try {
try {
@ -181,7 +181,7 @@ namespace pEp {
} catch ( const std : : exception & e ) {
} catch ( const std : : exception & e ) {
throw std : : invalid_argument ( " PityNode not found: ' " + name + " ' " ) ;
throw std : : invalid_argument ( " PityNode not found: ' " + name + " ' " ) ;
}
}
return * ret ;
return ret ;
}
}
// name is alphanumeric only (everything else will be replaced by an underscore)
// name is alphanumeric only (everything else will be replaced by an underscore)