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> ¶meterNames, 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