MemberTemplate.h

Go to the documentation of this file.
00001 // @(#)root/reflex:$Id: MemberTemplate.h 29288 2009-07-01 13:03:35Z axel $
00002 // Author: Stefan Roiser 2004
00003 
00004 // Copyright CERN, CH-1211 Geneva 23, 2004-2006, All rights reserved.
00005 //
00006 // Permission to use, copy, modify, and distribute this software for any
00007 // purpose is hereby granted without fee, provided that this copyright and
00008 // permissions notice appear in all copies and derivatives.
00009 //
00010 // This software is provided "as is" without express or implied warranty.
00011 
00012 #ifndef Reflex_MemberTemplate
00013 #define Reflex_MemberTemplate
00014 
00015 // Include files
00016 #include "Reflex/Kernel.h"
00017 
00018 
00019 namespace Reflex {
00020 // forward declarations
00021 class MemberTemplateName;
00022 class Member;
00023 
00024 /**
00025  * @class MemberTemplate MemberTemplate.h Reflex/MemberTemplate.h
00026  * @author Stefan Roiser
00027  * @date 2005-02-03
00028  * @ingroup Ref
00029  */
00030 class RFLX_API MemberTemplate {
00031    friend class OwnedMemberTemplate;
00032 
00033 public:
00034    /** default constructor */
00035    MemberTemplate(const MemberTemplateName * memberTemplateName = 0);
00036 
00037 
00038    /** copy constructor */
00039    MemberTemplate(const MemberTemplate &rh);
00040 
00041 
00042    /** destructor */
00043    ~MemberTemplate();
00044 
00045 
00046    /**
00047     * operator bool will return true if the member template is resolved
00048     * @return true if member template is resolved
00049     */
00050    operator bool() const;
00051 
00052 
00053    /**
00054     * operator == will return true if two member templates are the same
00055     * @return true if member templates match
00056     */
00057    bool operator ==(const MemberTemplate& rh) const;
00058 
00059 
00060    /**
00061     * ByName will return a member template corresponding to the argument name
00062     * @param member template name to lookup
00063     * @param nTemplateParams looks up the template family with this number of template parameters
00064     *        if it is set to 0, the first occurence of the template family name will be returned
00065     * @return corresponding member template to name
00066     */
00067    static MemberTemplate ByName(const std::string& name,
00068                                 size_t nTemplateParams = 0);
00069 
00070 
00071    /**
00072     * Id will return a memory address which is a unique id for this member template
00073     * @return unique id of this member template
00074     */
00075    void* Id() const;
00076 
00077 
00078    /**
00079     * MemberTemplateAt will return the nth member template defined
00080     * @param nth member template
00081     * @return nth member template
00082     */
00083    static MemberTemplate MemberTemplateAt(size_t nth);
00084 
00085 
00086    /**
00087     * MemberTemplateSize will return the number of member templates defined
00088     * @return number of defined member templates
00089     */
00090    static size_t MemberTemplateSize();
00091 
00092 
00093    /**
00094     * MemberTemplate_Begin returns the begin iterator of the member template container
00095     * @return begin iterator of member template container
00096     */
00097    static MemberTemplate_Iterator MemberTemplate_Begin();
00098 
00099 
00100    /**
00101     * MemberTemplate_End returns the end iterator of the member template container
00102     * @return end iterator of member template container
00103     */
00104    static MemberTemplate_Iterator MemberTemplate_End();
00105 
00106 
00107    /**
00108     * MemberTemplate_Rbegin returns the rbegin iterator of the member template container
00109     * @return rbegin iterator of member template container
00110     */
00111    static Reverse_MemberTemplate_Iterator MemberTemplate_RBegin();
00112 
00113 
00114    /**
00115     * MemberTemplate_Rend returns the rend iterator of the member template container
00116     * @return rend iterator of member template container
00117     */
00118    static Reverse_MemberTemplate_Iterator MemberTemplate_REnd();
00119 
00120 
00121    /**
00122     * Name will return the name of the template family and a list of
00123     * all currently available instantiations
00124     * @return template family name with all instantiantion
00125     */
00126    std::string Name(unsigned int mod = 0) const;
00127 
00128 
00129    /**
00130     * TemplateInstance_Begin returns the begin iterator of the instance container
00131     * @return the begin iterator of the instance container
00132     */
00133    Member_Iterator TemplateInstance_Begin() const;
00134 
00135 
00136    /**
00137     * TemplateInstance_End returns the end iterator of the instance container
00138     * @return the end iterator of the instance container
00139     */
00140    Member_Iterator TemplateInstance_End() const;
00141 
00142 
00143    /**
00144     * TemplateInstance_RBegin returns the rbegin iterator of the instance container
00145     * @return the rbegin iterator of the instance container
00146     */
00147    Reverse_Member_Iterator TemplateInstance_RBegin() const;
00148 
00149 
00150    /**
00151     * TemplateInstance_Rend returns the rend iterator of the instance container
00152     * @return the rend iterator of the instance container
00153     */
00154    Reverse_Member_Iterator TemplateInstance_REnd() const;
00155 
00156 
00157    /**
00158     * TemplateInstanceAt will return the nth template instantion
00159     * @param  nth template instantion
00160     * @return pointer to nth template instantion
00161     */
00162    Member TemplateInstanceAt(size_t nth) const;
00163 
00164 
00165    /**
00166     * instantionSize will return the number of template instantions for
00167     * this template family
00168     * @return number of template instantions
00169     */
00170    size_t TemplateInstanceSize() const;
00171 
00172 
00173    /**
00174     * TemplateParameterDefaultAt will return the nth FunctionParameterAt default value as string
00175     * @param nth template FunctionParameterAt
00176     * @return default value of nth template FunctionParameterAt
00177     */
00178    std::string TemplateParameterDefaultAt(size_t nth) const;
00179 
00180 
00181    /**
00182     * TemplateParameterDefault_Begin returns the begin of the container of template parameter default names
00183     * @return begin of container of template parameter default names
00184     */
00185    StdString_Iterator TemplateParameterDefault_Begin() const;
00186 
00187 
00188    /**
00189     * TemplateParameterDefault_End returns the end of the container of template parameter default names
00190     * @return end of container of template parameter default names
00191     */
00192    StdString_Iterator TemplateParameterDefault_End() const;
00193 
00194 
00195    /**
00196     * TemplateParameterDefault_RBegin returns the reverse begin of the container of template parameter default names
00197     * @return reverse begin of container of template parameter default names
00198     */
00199    Reverse_StdString_Iterator TemplateParameterDefault_RBegin() const;
00200 
00201 
00202    /**
00203     * TemplateParameterDefault_REnd returns the reverse end of the container of template parameter default names
00204     * @return reverse end of container of template parameter default names
00205     */
00206    Reverse_StdString_Iterator TemplateParameterDefault_REnd() const;
00207 
00208 
00209    /**
00210     * TemplateParameterNameAt will the Name of the nth FunctionParameterAt
00211     * @param  nth template FunctionParameterAt
00212     * @return Name of nth template FunctionParameterAt
00213     */
00214    std::string TemplateParameterNameAt(size_t nth) const;
00215 
00216 
00217    /**
00218     * TemplateParameterName_Begin returns the begin of the container of template parameter names
00219     * @return begin of container of template parameter names
00220     */
00221    StdString_Iterator TemplateParameterName_Begin() const;
00222 
00223 
00224    /**
00225     * TemplateParameterName_End returns the end of the container of template parameter names
00226     * @return end of container of template parameter names
00227     */
00228    StdString_Iterator TemplateParameterName_End() const;
00229 
00230 
00231    /**
00232     * TemplateParameterName_RBegin returns the reverse begin of the container of template parameter names
00233     * @return reverse begin of container of template parameter names
00234     */
00235    Reverse_StdString_Iterator TemplateParameterName_RBegin() const;
00236 
00237 
00238    /**
00239     * TemplateParameterName_REnd returns the reverse end of the container of template parameter names
00240     * @return reverse end of container of template parameter names
00241     */
00242    Reverse_StdString_Iterator TemplateParameterName_REnd() const;
00243 
00244 
00245    /**
00246     * TemplateParameterSize will return the number of template parameters
00247     * @return number of template parameters
00248     */
00249    size_t TemplateParameterSize() const;
00250 
00251 public:
00252    /**
00253     * AddTemplateInstance adds one TemplateInstanceAt of the template to the local container
00254     * @param templateInstance the template TemplateInstanceAt
00255     */
00256    void AddTemplateInstance(const Member& templateInstance) const;
00257 
00258 private:
00259    /**
00260     * pointer to the member template implementation
00261     * @label member template name
00262     * @link aggregation
00263     * @clientCardinality 1
00264     * @supplierCardinality 1
00265     */
00266    const MemberTemplateName* fMemberTemplateName;
00267 
00268 };    // class MemberTemplate
00269 
00270 } // namespace Reflex
00271 
00272 #include "Reflex/internal/MemberTemplateName.h"
00273 #include "Reflex/internal/MemberTemplateImpl.h"
00274 
00275 //-------------------------------------------------------------------------------
00276 inline Reflex::MemberTemplate::MemberTemplate(const MemberTemplateName* memberTemplateName)
00277 //-------------------------------------------------------------------------------
00278    : fMemberTemplateName(memberTemplateName) {
00279 }
00280 
00281 
00282 //-------------------------------------------------------------------------------
00283 inline Reflex::MemberTemplate::MemberTemplate(const MemberTemplate& rh)
00284 //-------------------------------------------------------------------------------
00285    : fMemberTemplateName(rh.fMemberTemplateName) {
00286 }
00287 
00288 
00289 //-------------------------------------------------------------------------------
00290 inline Reflex::MemberTemplate::~MemberTemplate() {
00291 }
00292 
00293 //-------------------------------------------------------------------------------
00294 
00295 
00296 //-------------------------------------------------------------------------------
00297 inline
00298 Reflex::MemberTemplate::operator bool() const {
00299 //-------------------------------------------------------------------------------
00300    if (this->fMemberTemplateName && this->fMemberTemplateName->fMemberTemplateImpl) {
00301       return true;
00302    }
00303    return false;
00304 }
00305 
00306 
00307 //-------------------------------------------------------------------------------
00308 inline bool
00309 Reflex::MemberTemplate::operator ==(const MemberTemplate& rh) const {
00310 //-------------------------------------------------------------------------------
00311    return fMemberTemplateName == rh.fMemberTemplateName;
00312 }
00313 
00314 
00315 //-------------------------------------------------------------------------------
00316 inline void*
00317 Reflex::MemberTemplate::Id() const {
00318 //-------------------------------------------------------------------------------
00319    return (void*) fMemberTemplateName;
00320 }
00321 
00322 
00323 //-------------------------------------------------------------------------------
00324 inline size_t
00325 Reflex::MemberTemplate::MemberTemplateSize() {
00326 //-------------------------------------------------------------------------------
00327    return MemberTemplateName::MemberTemplateSize();
00328 }
00329 
00330 
00331 //-------------------------------------------------------------------------------
00332 inline size_t
00333 Reflex::MemberTemplate::TemplateInstanceSize() const {
00334 //-------------------------------------------------------------------------------
00335    if (*this) {
00336       return fMemberTemplateName->fMemberTemplateImpl->TemplateInstanceSize();
00337    }
00338    return 0;
00339 }
00340 
00341 
00342 //-------------------------------------------------------------------------------
00343 inline size_t
00344 Reflex::MemberTemplate::TemplateParameterSize() const {
00345 //-------------------------------------------------------------------------------
00346    if (*this) {
00347       return fMemberTemplateName->fMemberTemplateImpl->TemplateParameterSize();
00348    }
00349    return 0;
00350 }
00351 
00352 
00353 //-------------------------------------------------------------------------------
00354 inline std::string
00355 Reflex::MemberTemplate::TemplateParameterDefaultAt(size_t nth) const {
00356 //-------------------------------------------------------------------------------
00357    if (*this) {
00358       return fMemberTemplateName->fMemberTemplateImpl->TemplateParameterDefaultAt(nth);
00359    }
00360    return "";
00361 }
00362 
00363 
00364 //-------------------------------------------------------------------------------
00365 inline Reflex::StdString_Iterator
00366 Reflex::MemberTemplate::TemplateParameterDefault_Begin() const {
00367 //-------------------------------------------------------------------------------
00368    if (*this) {
00369       return fMemberTemplateName->fMemberTemplateImpl->TemplateParameterDefault_Begin();
00370    }
00371    return Dummy::StdStringCont().begin();
00372 }
00373 
00374 
00375 //-------------------------------------------------------------------------------
00376 inline Reflex::StdString_Iterator
00377 Reflex::MemberTemplate::TemplateParameterDefault_End() const {
00378 //-------------------------------------------------------------------------------
00379    if (*this) {
00380       return fMemberTemplateName->fMemberTemplateImpl->TemplateParameterDefault_End();
00381    }
00382    return Dummy::StdStringCont().end();
00383 }
00384 
00385 
00386 //-------------------------------------------------------------------------------
00387 inline Reflex::Reverse_StdString_Iterator
00388 Reflex::MemberTemplate::TemplateParameterDefault_RBegin() const {
00389 //-------------------------------------------------------------------------------
00390    if (*this) {
00391       return fMemberTemplateName->fMemberTemplateImpl->TemplateParameterDefault_RBegin();
00392    }
00393    return Dummy::StdStringCont().rbegin();
00394 }
00395 
00396 
00397 //-------------------------------------------------------------------------------
00398 inline Reflex::Reverse_StdString_Iterator
00399 Reflex::MemberTemplate::TemplateParameterDefault_REnd() const {
00400 //-------------------------------------------------------------------------------
00401    if (*this) {
00402       return fMemberTemplateName->fMemberTemplateImpl->TemplateParameterDefault_REnd();
00403    }
00404    return Dummy::StdStringCont().rend();
00405 }
00406 
00407 
00408 //-------------------------------------------------------------------------------
00409 inline std::string
00410 Reflex::MemberTemplate::TemplateParameterNameAt(size_t nth) const {
00411 //-------------------------------------------------------------------------------
00412    if (*this) {
00413       return fMemberTemplateName->fMemberTemplateImpl->TemplateParameterNameAt(nth);
00414    }
00415    return "";
00416 }
00417 
00418 
00419 //-------------------------------------------------------------------------------
00420 inline Reflex::StdString_Iterator
00421 Reflex::MemberTemplate::TemplateParameterName_Begin() const {
00422 //-------------------------------------------------------------------------------
00423    if (*this) {
00424       return fMemberTemplateName->fMemberTemplateImpl->TemplateParameterName_Begin();
00425    }
00426    return Dummy::StdStringCont().begin();
00427 }
00428 
00429 
00430 //-------------------------------------------------------------------------------
00431 inline Reflex::StdString_Iterator
00432 Reflex::MemberTemplate::TemplateParameterName_End() const {
00433 //-------------------------------------------------------------------------------
00434    if (*this) {
00435       return fMemberTemplateName->fMemberTemplateImpl->TemplateParameterName_End();
00436    }
00437    return Dummy::StdStringCont().end();
00438 }
00439 
00440 
00441 //-------------------------------------------------------------------------------
00442 inline Reflex::Reverse_StdString_Iterator
00443 Reflex::MemberTemplate::TemplateParameterName_RBegin() const {
00444 //-------------------------------------------------------------------------------
00445    if (*this) {
00446       return fMemberTemplateName->fMemberTemplateImpl->TemplateParameterName_RBegin();
00447    }
00448    return Dummy::StdStringCont().rbegin();
00449 }
00450 
00451 
00452 //-------------------------------------------------------------------------------
00453 inline Reflex::Reverse_StdString_Iterator
00454 Reflex::MemberTemplate::TemplateParameterName_REnd() const {
00455 //-------------------------------------------------------------------------------
00456    if (*this) {
00457       return fMemberTemplateName->fMemberTemplateImpl->TemplateParameterName_REnd();
00458    }
00459    return Dummy::StdStringCont().rend();
00460 }
00461 
00462 
00463 #endif // Reflex_MemberTemplate

Generated on Tue Jul 5 14:25:54 2011 for ROOT_528-00b_version by  doxygen 1.5.1