From 320e75af4f86dd1dc9c9a55f9ca64399ba66ff78 Mon Sep 17 00:00:00 2001 From: Michael Andres Date: Mon, 21 Nov 2005 09:55:24 +0000 Subject: [PATCH] - Added test boo isKind<_Res>( Resolvable::constPtr ) - Added conversion _Res::Ptr asKind<_Res>( Resolvable::Ptr ) _Res::constPtr asKind<_Res>( Resolvable::constPtr ) --- devel/devel.ma/Main.cc | 21 ++++++++++++++++++++- zypp/Resolvable.h | 38 +++++++++++++++++++++++++++++++++++++- 2 files changed, 57 insertions(+), 2 deletions(-) diff --git a/devel/devel.ma/Main.cc b/devel/devel.ma/Main.cc index d5cb1c1..438a6e8 100644 --- a/devel/devel.ma/Main.cc +++ b/devel/devel.ma/Main.cc @@ -4,6 +4,7 @@ #include #include #include +#include #include #define TAG INT << __PRETTY_FUNCTION__ << std::endl @@ -51,7 +52,9 @@ template impl_r ); } + using namespace zypp; + /****************************************************************** ** ** @@ -65,7 +68,23 @@ int main( int argc, char * argv[] ) INT << "===[START]==========================================" << endl; base::shared_ptr pi; - OUT( makeResolvable( pi ) ); + Package::Ptr p( makeResolvable( pi ) ); + OUT( p ); + + DBG << isKind(p) << endl; + DBG << isKind(p) << endl; + DBG << isKind(p) << endl; + + Resolvable::constPtr r( p ); + DBG << isKind(r) << endl; + DBG << isKind(r) << endl; + DBG << isKind(r) << endl; + + Package::constPtr pp = asKind(r); + + MIL << asKind(r) << endl; + MIL << asKind(r) << endl; + INT << "===[END]============================================" << endl; return 0; diff --git a/zypp/Resolvable.h b/zypp/Resolvable.h index a76714e..f184b84 100644 --- a/zypp/Resolvable.h +++ b/zypp/Resolvable.h @@ -77,8 +77,44 @@ namespace zypp }; /////////////////////////////////////////////////////////////////// + /** Test whether a Resolvable::Ptr is of a certain Kind. + * \return \c Ture iff \a p is not \c NULL and points to a Resolvable + * of the specified Kind. + * \relates Resolvable + * \code + * isKind(resPtr); + * \endcode + */ + template + inline bool isKind( const Resolvable::constPtr & p ) + { return p && p->kind() == ResTraits<_Res>::_kind; } + + // Specialization for Resolvable: Always true. + template<> + inline bool isKind( const Resolvable::constPtr & p ) + { return p; } + + // Specialization for ResObject: Always true. + template<> + inline bool isKind( const Resolvable::constPtr & p ) + { return p; } + + + /** Convert Resolvable::Ptr into Ptr of a certain Kind. + * \return \c NULL iff \a p is \c NULL or points to a Resolvable + * not of the specified Kind. + * \relates Resolvable + * \code + * asKind(resPtr); + * \endcode + */ + template + inline typename ResTraits<_Res>::PtrType asKind( const Resolvable::Ptr & p ) + { return base::dynamic_pointer_cast<_Res>(p); } - + template + inline typename ResTraits<_Res>::constPtrType asKind( const Resolvable::constPtr & p ) + { return base::dynamic_pointer_cast(p); } /////////////////////////////////////////////////////////////////// -- 2.7.4