Go to the documentation of this file.
40 #ifndef runTimeSelectionTables_H
41 #define runTimeSelectionTables_H
54 #define declareRunTimeSelectionTableBase(returnType,prefix,argList) \
57 typedef returnType (*prefix##Ptr)argList; \
60 typedef ::Foam::HashTable \
64 ::Foam::Hash<::Foam::word> \
65 > prefix##TableType; \
68 typedef ::Foam::HashTable \
70 std::pair<::Foam::word,int>, \
72 ::Foam::Hash<::Foam::word> \
73 > prefix##CompatTableType; \
76 static prefix##TableType* prefix##TablePtr_; \
79 static std::unique_ptr<prefix##CompatTableType> prefix##CompatTablePtr_; \
82 static prefix##CompatTableType& prefix##CompatTable(); \
85 static void prefix##TablePtr_construct(bool load); \
88 static prefix##Ptr prefix##Table(const ::Foam::word& k)
92 #define defineRunTimeSelectionTableBase(baseType,prefix,Tspecialize) \
95 Tspecialize prefix##TableType* prefix##TablePtr_(nullptr); \
99 std::unique_ptr<prefix##CompatTableType> prefix##CompatTablePtr_(nullptr); \
102 Tspecialize prefix##CompatTableType& prefix##CompatTable() \
104 if (!prefix##CompatTablePtr_) \
106 prefix##CompatTablePtr_.reset(new prefix##CompatTableType(16)); \
108 return *(prefix##CompatTablePtr_); \
112 Tspecialize void prefix##TablePtr_construct(bool load) \
114 static bool constructed = false; \
119 prefix##TablePtr_ = new prefix##TableType; \
120 constructed = true; \
123 else if (prefix##TablePtr_) \
125 delete prefix##TablePtr_; \
126 prefix##TablePtr_ = nullptr; \
127 prefix##CompatTablePtr_.reset(nullptr); \
128 constructed = false; \
133 Tspecialize prefix##Ptr prefix##Table(const ::Foam::word& k) \
135 if (prefix##TablePtr_) \
137 const auto& tbl = *prefix##TablePtr_; \
138 auto iter = tbl.cfind(k); \
139 if (!iter.found() && prefix##CompatTablePtr_) \
141 const auto altIter = prefix##CompatTablePtr_->cfind(k); \
142 if (altIter.found()) \
144 const auto& alt = altIter.val(); \
145 iter = tbl.cfind(alt.first); \
146 if (::Foam::error::warnAboutAge(alt.second)) \
149 << "Using [v" << alt.second << "] '" << k \
150 << "' instead of '" << alt.first \
151 << " in runtime selection table: " \
152 << #baseType << '\n' << std::endl; \
153 ::Foam::error::warnAboutAge("lookup", alt.second); \
174 #define declareRunTimeSelectionTable\
175 (ptrWrapper,baseType,argNames,argList,parList) \
177 declareRunTimeSelectionTableBase( \
178 ptrWrapper<baseType>, argNames##Constructor, argList); \
181 template<class baseType##Type> \
182 struct addAlias##argNames##ConstructorToTable \
184 explicit addAlias##argNames##ConstructorToTable \
186 const ::Foam::word& k, \
187 const ::Foam::word& alias, \
191 argNames##ConstructorCompatTable() \
192 .set(alias, std::pair<::Foam::word,int>(k,ver)); \
197 template<class baseType##Type> \
198 struct add##argNames##ConstructorToTable \
200 static ptrWrapper<baseType> New argList \
202 return ptrWrapper<baseType>(new baseType##Type parList); \
205 explicit add##argNames##ConstructorToTable \
207 const ::Foam::word& k = baseType##Type::typeName \
210 argNames##ConstructorTablePtr_construct(true); \
211 if (!argNames##ConstructorTablePtr_->insert(k, New)) \
214 << "Duplicate entry " << k << " in runtime table " \
215 << #baseType << std::endl; \
216 ::Foam::error::safePrintStack(std::cerr); \
220 ~add##argNames##ConstructorToTable() \
222 argNames##ConstructorTablePtr_construct(false); \
225 add##argNames##ConstructorToTable \
226 (const add##argNames##ConstructorToTable&) = delete; \
229 (const add##argNames##ConstructorToTable&) = delete; \
234 template<class baseType##Type> \
235 struct addRemovable##argNames##ConstructorToTable \
237 const ::Foam::word name; \
239 static ptrWrapper<baseType> New argList \
241 return ptrWrapper<baseType>(new baseType##Type parList); \
244 explicit addRemovable##argNames##ConstructorToTable \
246 const ::Foam::word& k = baseType##Type::typeName \
251 argNames##ConstructorTablePtr_construct(true); \
252 argNames##ConstructorTablePtr_->set(k, New); \
255 ~addRemovable##argNames##ConstructorToTable() \
257 if (argNames##ConstructorTablePtr_) \
259 argNames##ConstructorTablePtr_->erase(name); \
263 addRemovable##argNames##ConstructorToTable \
264 (const addRemovable##argNames##ConstructorToTable&) = delete; \
267 (const addRemovable##argNames##ConstructorToTable&) = delete; \
272 #define declareRunTimeNewSelectionTable\
273 (ptrWrapper,baseType,argNames,argList,parList) \
275 declareRunTimeSelectionTableBase( \
276 ptrWrapper<baseType>,argNames##Constructor,argList); \
279 template<class baseType##Type> \
280 struct addAlias##argNames##ConstructorToTable \
282 explicit addAlias##argNames##ConstructorToTable \
284 const ::Foam::word& k, \
285 const ::Foam::word& alias, \
289 argNames##ConstructorCompatTable() \
290 .set(alias, std::pair<::Foam::word,int>(k,ver)); \
295 template<class baseType##Type> \
296 struct add##argNames##ConstructorToTable \
298 static ptrWrapper<baseType> New##baseType argList \
300 return ptrWrapper<baseType>(baseType##Type::New parList.ptr()); \
303 explicit add##argNames##ConstructorToTable \
305 const ::Foam::word& k = baseType##Type::typeName \
308 argNames##ConstructorTablePtr_construct(true); \
309 if (!argNames##ConstructorTablePtr_->insert(k, New##baseType)) \
312 << "Duplicate entry " << k << " in runtime table " \
313 << #baseType << std::endl; \
314 ::Foam::error::safePrintStack(std::cerr); \
318 ~add##argNames##ConstructorToTable() \
320 argNames##ConstructorTablePtr_construct(false); \
323 add##argNames##ConstructorToTable \
324 (const add##argNames##ConstructorToTable&) = delete; \
327 (const add##argNames##ConstructorToTable&) = delete; \
331 template<class baseType##Type> \
332 struct addRemovable##argNames##ConstructorToTable \
334 const ::Foam::word name; \
336 static ptrWrapper<baseType> New##baseType argList \
338 return ptrWrapper<baseType>(baseType##Type::New parList.ptr()); \
341 explicit addRemovable##argNames##ConstructorToTable \
343 const ::Foam::word& k = baseType##Type::typeName \
348 argNames##ConstructorTablePtr_construct(true); \
349 argNames##ConstructorTablePtr_->set(k, New##baseType); \
352 ~addRemovable##argNames##ConstructorToTable() \
354 if (argNames##ConstructorTablePtr_) \
356 argNames##ConstructorTablePtr_->erase(name); \
360 addRemovable##argNames##ConstructorToTable \
361 (const addRemovable##argNames##ConstructorToTable&) = delete; \
364 (const addRemovable##argNames##ConstructorToTable&) = delete; \
375 #define defineRunTimeSelectionTable(baseType,argNames) \
377 defineRunTimeSelectionTableBase( \
378 baseType,baseType::argNames##Constructor,)
383 #define defineTemplateRunTimeSelectionTable(baseType,argNames) \
385 defineRunTimeSelectionTableBase( \
386 baseType,baseType::argNames##Constructor,template<>)
391 #define defineTemplatedRunTimeSelectionTable(baseType,argNames,Targ) \
393 defineRunTimeSelectionTableBase( \
394 baseType,baseType<Targ>::argNames##Constructor,template<>)
Ostream & endl(Ostream &os)
Add newline and flush stream.
#define declareRunTimeSelectionTableBase(returnType, prefix, argList)
#define declareRunTimeSelectionTable(ptrWrapper, baseType, argNames, argList, parList)
Declare a run-time selection (variables and adder classes)
#define defineTemplateRunTimeSelectionTable(baseType, argNames)
Define run-time selection table for template classes.
void add(FieldField< Field1, typename typeOfSum< Type1, Type2 >::type > &f, const FieldField< Field1, Type1 > &f1, const FieldField< Field2, Type2 > &f2)
tmp< DimensionedField< TypeR, GeoMesh > > New(const tmp< DimensionedField< TypeR, GeoMesh >> &tdf1, const word &name, const dimensionSet &dimensions)
Global function forwards to reuseTmpDimensionedField::New.
label k
Boltzmann constant.
word name(const expressions::valueTypeCode typeCode)
A word representation of a valueTypeCode. Empty for INVALID.
#define defineRunTimeSelectionTableBase(baseType, prefix, Tspecialize)
static void safePrintStack(std::ostream &os)