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