MemberTemplateImpl.h

Go to the documentation of this file.
00001 // @(#)root/reflex:$Id: MemberTemplateImpl.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_MemberTemplateImpl
00013 #define Reflex_MemberTemplateImpl
00014 
00015 // Include files
00016 #include "Reflex/Kernel.h"
00017 #include "Reflex/Scope.h"
00018 
00019 #ifdef _WIN32
00020 # pragma warning( push )
00021 # pragma warning( disable : 4251 )
00022 #endif
00023 
00024 namespace Reflex {
00025 // forward declarations
00026 class Member;
00027 class Scope;
00028 class MemberTemplate;
00029 class MemberTemplateName;
00030 class FunctionMemberTemplateInstance;
00031 
00032 /**
00033  * @class MemberTemplateImpl MemberTemplateImpl.h Reflex/MemberTemplateImpl.h
00034  * @author Stefan Roiser
00035  * @date 2005-02-03
00036  * @ingroup Ref
00037  */
00038 class RFLX_API MemberTemplateImpl {
00039 public:
00040    /** default constructor */
00041    MemberTemplateImpl(const char* templateName,
00042                       const Scope &scope,
00043                       const std::vector<std::string> &parameterNames,
00044                       const std::vector<std::string>& parameterDefaults = std::vector<std::string>());
00045 
00046 
00047    /** destructor */
00048    virtual ~MemberTemplateImpl();
00049 
00050 
00051    /**
00052     * operator == will return true if two At templates are the same
00053     * @return true if At templates match
00054     */
00055    bool operator ==(const MemberTemplateImpl& rh) const;
00056 
00057 
00058    /**
00059     * TemplateInstance_Begin returns the begin iterator of the instance container
00060     * @return the begin iterator of the instance container
00061     */
00062    Member_Iterator TemplateInstance_Begin() const;
00063 
00064 
00065    /**
00066     * TemplateInstance_End returns the end iterator of the instance container
00067     * @return the end iterator of the instance container
00068     */
00069    Member_Iterator TemplateInstance_End() const;
00070 
00071 
00072    /**
00073     * TemplateInstance_RBegin returns the rbegin iterator of the instance container
00074     * @return the rbegin iterator of the instance container
00075     */
00076    Reverse_Member_Iterator TemplateInstance_RBegin() const;
00077 
00078 
00079    /**
00080     * TemplateInstance_Rend returns the rend iterator of the instance container
00081     * @return the rend iterator of the instance container
00082     */
00083    Reverse_Member_Iterator TemplateInstance_REnd() const;
00084 
00085 
00086    /**
00087     * instantion will return a pointer to the nth template instantion
00088     * @param  nth template instantion
00089     * @return pointer to nth template instantion
00090     */
00091    Member TemplateInstanceAt(size_t nth) const;
00092 
00093 
00094    /**
00095     * instantionSize will return the number of template instantions for
00096     * this template family
00097     * @return number of template instantions
00098     */
00099    size_t TemplateInstanceSize() const;
00100 
00101 
00102    /**
00103     * TemplateParameterSize will return the number of template parameters
00104     * @return number of template parameters
00105     */
00106    size_t TemplateParameterSize() const;
00107 
00108 
00109    /**
00110     * TemplateParameterDefaultAt will return the nth FunctionParameterAt default value as string
00111     * @param nth template FunctionParameterAt
00112     * @return default value of nth template FunctionParameterAt
00113     */
00114    std::string TemplateParameterDefaultAt(size_t nth) const;
00115 
00116 
00117    StdString_Iterator TemplateParameterDefault_Begin() const;
00118    StdString_Iterator TemplateParameterDefault_End() const;
00119    Reverse_StdString_Iterator TemplateParameterDefault_RBegin() const;
00120    Reverse_StdString_Iterator TemplateParameterDefault_REnd() const;
00121 
00122 
00123    /**
00124     * TemplateParameterNameAt will the Name of the nth FunctionParameterAt
00125     * @param  nth template FunctionParameterAt
00126     * @return Name of nth template FunctionParameterAt
00127     */
00128    std::string TemplateParameterNameAt(size_t nth) const;
00129 
00130 
00131    StdString_Iterator TemplateParameterName_Begin() const;
00132    StdString_Iterator TemplateParameterName_End() const;
00133    Reverse_StdString_Iterator TemplateParameterName_RBegin() const;
00134    Reverse_StdString_Iterator TemplateParameterName_REnd() const;
00135 
00136 
00137    /**
00138     * Return the member template API class corresponding to this member template impl
00139     * @return corresponding member template
00140     */
00141    MemberTemplate ThisMemberTemplate() const;
00142 
00143 public:
00144    /**
00145     * AddTemplateInstance adds one TemplateInstanceAt of the template to the local container
00146     * @param templateInstance the template TemplateInstanceAt
00147     */
00148    void AddTemplateInstance(const Member& templateInstance) const;
00149 
00150 private:
00151    /**
00152     * declaring scope of this member template
00153     * @link aggregation
00154     * @label member template scope
00155     * @clientCardinality 1
00156     * @supplierCardinality 1
00157     */
00158    Scope fScope;
00159 
00160 
00161    /**
00162     * the class template instances
00163     * @link aggregation
00164     * @supplierCardinality 1..*
00165     * @clientCardinality 1
00166     * @label template instances
00167     */
00168    mutable
00169    std::vector<Member> fTemplateInstances;
00170 
00171 
00172    /**
00173     * container of function parameter template names
00174     */
00175    mutable
00176    std::vector<std::string> fParameterNames;
00177 
00178 
00179    /**
00180     * function  parameter template default values
00181     */
00182    mutable
00183    std::vector<std::string> fParameterDefaults;
00184 
00185 
00186    /**
00187     * number of required template parameters
00188     */
00189    size_t fReqParameters;
00190 
00191 
00192    /**
00193     * pointer back to the member template name
00194     * @link aggregation
00195     * @label member template name
00196     * @supplierCardinality 1
00197     * @clientCardinality 1
00198     */
00199    MemberTemplateName* fMemberTemplateName;
00200 
00201 
00202 };    // class MemberTemplateImpl
00203 
00204 } // namespace Reflex
00205 
00206 
00207 //-------------------------------------------------------------------------------
00208 inline size_t
00209 Reflex::MemberTemplateImpl::TemplateParameterSize() const {
00210 //-------------------------------------------------------------------------------
00211    return fParameterNames.size();
00212 }
00213 
00214 
00215 //-------------------------------------------------------------------------------
00216 inline std::string
00217 Reflex::MemberTemplateImpl::TemplateParameterDefaultAt(size_t nth) const {
00218 //-------------------------------------------------------------------------------
00219    if (nth < fParameterDefaults.size()) {
00220       return fParameterDefaults[nth];
00221    }
00222    return "";
00223 }
00224 
00225 
00226 //-------------------------------------------------------------------------------
00227 inline Reflex::StdString_Iterator
00228 Reflex::MemberTemplateImpl::TemplateParameterDefault_Begin() const {
00229 //-------------------------------------------------------------------------------
00230    return fParameterDefaults.begin();
00231 }
00232 
00233 
00234 //-------------------------------------------------------------------------------
00235 inline Reflex::StdString_Iterator
00236 Reflex::MemberTemplateImpl::TemplateParameterDefault_End() const {
00237 //-------------------------------------------------------------------------------
00238    return fParameterDefaults.end();
00239 }
00240 
00241 
00242 //-------------------------------------------------------------------------------
00243 inline Reflex::Reverse_StdString_Iterator
00244 Reflex::MemberTemplateImpl::TemplateParameterDefault_RBegin() const {
00245 //-------------------------------------------------------------------------------
00246    return ((const std::vector<std::string> &)fParameterDefaults).rbegin();
00247 }
00248 
00249 
00250 //-------------------------------------------------------------------------------
00251 inline Reflex::Reverse_StdString_Iterator
00252 Reflex::MemberTemplateImpl::TemplateParameterDefault_REnd() const {
00253 //-------------------------------------------------------------------------------
00254    return ((const std::vector<std::string> &)fParameterDefaults).rend();
00255 }
00256 
00257 
00258 //-------------------------------------------------------------------------------
00259 inline std::string
00260 Reflex::MemberTemplateImpl::TemplateParameterNameAt(size_t nth) const {
00261 //-------------------------------------------------------------------------------
00262    if (nth < fParameterNames.size()) {
00263       return fParameterNames[nth];
00264    }
00265    return "";
00266 }
00267 
00268 
00269 //-------------------------------------------------------------------------------
00270 inline Reflex::StdString_Iterator
00271 Reflex::MemberTemplateImpl::TemplateParameterName_Begin() const {
00272 //-------------------------------------------------------------------------------
00273    return fParameterNames.begin();
00274 }
00275 
00276 
00277 //-------------------------------------------------------------------------------
00278 inline Reflex::StdString_Iterator
00279 Reflex::MemberTemplateImpl::TemplateParameterName_End() const {
00280 //-------------------------------------------------------------------------------
00281    return fParameterNames.end();
00282 }
00283 
00284 
00285 //-------------------------------------------------------------------------------
00286 inline Reflex::Reverse_StdString_Iterator
00287 Reflex::MemberTemplateImpl::TemplateParameterName_RBegin() const {
00288 //-------------------------------------------------------------------------------
00289    return ((const std::vector<std::string> &)fParameterNames).rbegin();
00290 }
00291 
00292 
00293 //-------------------------------------------------------------------------------
00294 inline Reflex::Reverse_StdString_Iterator
00295 Reflex::MemberTemplateImpl::TemplateParameterName_REnd() const {
00296 //-------------------------------------------------------------------------------
00297    return ((const std::vector<std::string> &)fParameterNames).rend();
00298 }
00299 
00300 
00301 #ifdef _WIN32
00302 # pragma warning( pop )
00303 #endif
00304 
00305 #endif // Reflex_MemberTemplateImpl

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