X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fyoink;a=blobdiff_plain;f=src%2Fstlplus%2Fcontainers%2Fsimple_ptr.tpp;h=4b08ffe8309a3d8fb29ad00d0516a8cbf5f01783;hp=13f55967c7ec00ea4c9150524e0589b4c95dd445;hb=4f6e4488a55f7e3ba3f7485d78177f793c0eab9a;hpb=6b0a0d0efafe34d48ab344fca3b479553bd4e62c diff --git a/src/stlplus/containers/simple_ptr.tpp b/src/stlplus/containers/simple_ptr.tpp index 13f5596..4b08ffe 100644 --- a/src/stlplus/containers/simple_ptr.tpp +++ b/src/stlplus/containers/simple_ptr.tpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////////////////////////// // Author: Daniel Milton -// Copyright: (c) Daniel Milton 2002-2009 +// Copyright: (c) Daniel Milton 2002 onwards //////////////////////////////////////////////////////////////////////////////// @@ -250,55 +250,6 @@ namespace stlplus make_unique(); } -#ifdef STLPLUS_MEMBER_TEMPLATES - - // dynamic cast of underlying pointer to a derived/parent - template - template - simple_ptr_base simple_ptr_base::dyn_cast(void) const - { - simple_ptr_base rtn; - rtn.m_pointer = dynamic_cast(m_pointer); - if (rtn.m_pointer) { - delete rtn.m_count; - rtn.m_count = m_count; - rtn.increment(); - } - return rtn; - } - - // static cast of underlying pointer to a derived/parent - template - template - simple_ptr_base simple_ptr_base::stat_cast(void) const - { - simple_ptr_base rtn; - rtn.m_pointer = static_cast(m_pointer); - if (rtn.m_pointer) { - delete rtn.m_count; - rtn.m_count = m_count; - rtn.increment(); - } - return rtn; - } - - // cast of underlying pointer to a base - while keeping the same ref-counted object - template - template - simple_ptr_base simple_ptr_base::cast(void) const - { - simple_ptr_base rtn; - rtn.m_pointer = (T2*)m_pointer; - if (rtn.m_pointer) { - delete rtn.m_count; - rtn.m_count = m_count; - rtn.increment(); - } - return rtn; - } - -#endif - // internal function for distinguishing unique simple_ptr objects // used for example in persistence routines @@ -332,6 +283,112 @@ namespace stlplus } } + + //////////////////////////////////////////////////////////////////////////////// + // simple_ptr class + //////////////////////////////////////////////////////////////////////////////// + +#ifdef STLPLUS_MEMBER_TEMPLATES + + template + template + simple_ptr simple_ptr::dyn_cast(void) const { + simple_ptr rtn; + T2* p = dynamic_cast(this->m_pointer); + if (p) rtn._make_alias(p, this->m_count); + return rtn; + } + + template + template + simple_ptr simple_ptr::stat_cast(void) const { + simple_ptr rtn; + T2* p = static_cast(this->m_pointer); + if (p) rtn._make_alias(p, this->m_count); + return rtn; + } + + template + template + simple_ptr simple_ptr::cast(void) const { + simple_ptr rtn; + T2* p = (T2*)this->m_pointer; + if (p) rtn._make_alias(p, this->m_count); + return rtn; + } + +#endif + + //////////////////////////////////////////////////////////////////////////////// + // simple_ptr_clone class + //////////////////////////////////////////////////////////////////////////////// + +#ifdef STLPLUS_MEMBER_TEMPLATES + + template + template + simple_ptr_clone simple_ptr_clone::dyn_cast(void) const { + simple_ptr_clone rtn; + T2* p = dynamic_cast(this->m_pointer); + if (p) rtn._make_alias(p, this->m_count); + return rtn; + } + + template + template + simple_ptr_clone simple_ptr_clone::stat_cast(void) const { + simple_ptr_clone rtn; + T2* p = static_cast(this->m_pointer); + if (p) rtn._make_alias(p, this->m_count); + return rtn; + } + + template + template + simple_ptr_clone simple_ptr_clone::cast(void) const { + simple_ptr_clone rtn; + T2* p = (T2*)this->m_pointer; + if (p) rtn._make_alias(p, this->m_count); + return rtn; + } + +#endif + + //////////////////////////////////////////////////////////////////////////////// + // simple_ptr_nocopy class + //////////////////////////////////////////////////////////////////////////////// + +#ifdef STLPLUS_MEMBER_TEMPLATES + + template + template + simple_ptr_nocopy simple_ptr_nocopy::dyn_cast(void) const { + simple_ptr_nocopy rtn; + T2* p = dynamic_cast(this->m_pointer); + if (p) rtn._make_alias(p, this->m_count); + return rtn; + } + + template + template + simple_ptr_nocopy simple_ptr_nocopy::stat_cast(void) const { + simple_ptr_nocopy rtn; + T2* p = static_cast(this->m_pointer); + if (p) rtn._make_alias(p, this->m_count); + return rtn; + } + + template + template + simple_ptr_nocopy simple_ptr_nocopy::cast(void) const { + simple_ptr_nocopy rtn; + T2* p = (T2*)this->m_pointer; + if (p) rtn._make_alias(p, this->m_count); + return rtn; + } + +#endif + //////////////////////////////////////////////////////////////////////////////// } // end namespace stlplus