00001 // @(#)root/reflex:$Id: MemberTemplateName.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_MemberTemplateName 00013 #define Reflex_MemberTemplateName 00014 00015 // Include files 00016 #include "Reflex/Kernel.h" 00017 00018 00019 namespace Reflex { 00020 // forward declarations 00021 class MemberTemplate; 00022 class MemberTemplateImpl; 00023 00024 /** 00025 * @class MemberTemplateName MemberTemplateName.h Reflex/internal/MemberTemplateName.h 00026 * @author Stefan Roiser 00027 * @date 8/8/2006 00028 * @ingroup Ref 00029 */ 00030 class RFLX_API MemberTemplateName { 00031 friend class MemberTemplate; 00032 friend class MemberTemplateImpl; 00033 00034 public: 00035 /** constructor */ 00036 MemberTemplateName(const char* name, 00037 MemberTemplateImpl * memberTemplImpl); 00038 00039 00040 /** 00041 * ByName will return a member template corresponding to the argument name 00042 * @param member template name to lookup 00043 * @param nTemplateParams looks up the template family with this number of template parameters 00044 * if it is set to 0, the first occurence of the template family name will be returned 00045 * @return corresponding member template to name 00046 */ 00047 static MemberTemplate ByName(const std::string& name, 00048 size_t nTemplateParams = 0); 00049 00050 00051 /** 00052 * CleanUp is called at the end of the process 00053 */ 00054 static void CleanUp(); 00055 00056 00057 /* 00058 * DeleteMemberTemplate will remove the dictionary information 00059 * of one member template from memory 00060 */ 00061 void DeleteMemberTemplate() const; 00062 00063 00064 /** 00065 * Name will return the name of the member template 00066 * @return name of member template 00067 */ 00068 std::string Name(unsigned int mod) const; 00069 00070 00071 /** 00072 * Name_c_str will return a char * pointer to the member template name 00073 * @return member template name as char * 00074 */ 00075 const char* Name_c_str() const; 00076 00077 00078 /** 00079 * ThisMemberTemplate will return the MemberTemplate API class of this member template 00080 * @return API member template class 00081 */ 00082 MemberTemplate ThisMemberTemplate() const; 00083 00084 00085 /** 00086 * MemberTemplateAt will return the nth member template defined 00087 * @param nth member template 00088 * @return nth member template 00089 */ 00090 static MemberTemplate MemberTemplateAt(size_t nth); 00091 00092 00093 /** 00094 * MemberTemplateSize will return the number of member templates defined 00095 * @return number of defined member templates 00096 */ 00097 static size_t MemberTemplateSize(); 00098 00099 00100 /** 00101 * MemberTemplate_Begin returns the begin iterator of the member template container 00102 * @return begin iterator of member template container 00103 */ 00104 static MemberTemplate_Iterator MemberTemplate_Begin(); 00105 00106 00107 /** 00108 * MemberTemplate_End returns the end iterator of the member template container 00109 * @return end iterator of member template container 00110 */ 00111 static MemberTemplate_Iterator MemberTemplate_End(); 00112 00113 00114 /** 00115 * MemberTemplate_Rbegin returns the rbegin iterator of the member template container 00116 * @return rbegin iterator of member template container 00117 */ 00118 static Reverse_MemberTemplate_Iterator MemberTemplate_RBegin(); 00119 00120 00121 /** 00122 * MemberTemplate_Rend returns the rend iterator of the member template container 00123 * @return rend iterator of member template container 00124 */ 00125 static Reverse_MemberTemplate_Iterator MemberTemplate_REnd(); 00126 00127 private: 00128 /** destructor */ 00129 ~MemberTemplateName(); 00130 00131 private: 00132 /** 00133 * The name of the member template 00134 */ 00135 std::string fName; 00136 00137 00138 /** 00139 * Pointer to the implementation of the member template 00140 * @link aggregation 00141 * @supplierCardinality 1 00142 * @clientCardinality 0..1 00143 * @label member template impl 00144 */ 00145 mutable 00146 MemberTemplateImpl * fMemberTemplateImpl; 00147 00148 00149 /** 00150 * pointer back to the member temlate 00151 * @label this member template 00152 * @link aggregation 00153 * @clientCardinality 1 00154 * @supplierCardinality 1 00155 */ 00156 MemberTemplate* fThisMemberTemplate; 00157 00158 }; // class MemberTemplate 00159 } // namespace Reflex 00160 00161 00162 //------------------------------------------------------------------------------- 00163 inline const char* 00164 Reflex::MemberTemplateName::Name_c_str() const { 00165 //------------------------------------------------------------------------------- 00166 return fName.c_str(); 00167 } 00168 00169 00170 #endif // Reflex_MemberTemplateName