40#ifndef Foam_runTimeSelectionTables_H
41#define Foam_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)
93#define defineRunTimeSelectionTableBase(baseType,prefix,Tspecialize) \
96 Tspecialize prefix##TableType* prefix##TablePtr_(nullptr); \
100 std::unique_ptr<prefix##CompatTableType> prefix##CompatTablePtr_(nullptr); \
103 Tspecialize prefix##CompatTableType& prefix##CompatTable() \
105 if (!prefix##CompatTablePtr_) \
107 prefix##CompatTablePtr_.reset(new prefix##CompatTableType(16)); \
109 return *(prefix##CompatTablePtr_); \
113 Tspecialize void prefix##TablePtr_construct(bool load) \
115 static bool constructed = false; \
120 prefix##TablePtr_ = new prefix##TableType; \
121 constructed = true; \
124 else if (prefix##TablePtr_) \
126 delete prefix##TablePtr_; \
127 prefix##TablePtr_ = nullptr; \
132 Tspecialize prefix##Ptr prefix##Table(const ::Foam::word& k) \
134 if (prefix##TablePtr_) \
136 const auto& tbl = *prefix##TablePtr_; \
137 auto iter = tbl.cfind(k); \
138 if (!iter.found() && prefix##CompatTablePtr_) \
140 const auto altIter = prefix##CompatTablePtr_->cfind(k); \
141 if (altIter.found()) \
143 const auto& alt = altIter.val(); \
144 iter = tbl.cfind(alt.first); \
145 if (::Foam::error::warnAboutAge(alt.second)) \
148 << "Using [v" << alt.second << "] '" << k \
149 << "' instead of '" << alt.first \
150 << "' in selection table: " \
151 << #baseType << '\n' << std::endl; \
152 ::Foam::error::warnAboutAge("lookup", alt.second); \
173#define declareRunTimeSelectionTable\
174(ptrWrapper,baseType,argNames,argList,parList) \
176 declareRunTimeSelectionTableBase( \
177 ptrWrapper<baseType>, argNames##Constructor, argList); \
180 template<class baseType##Type> \
181 struct addAlias##argNames##ConstructorToTable \
183 explicit addAlias##argNames##ConstructorToTable \
185 const ::Foam::word& k, \
186 const ::Foam::word& alias, \
190 argNames##ConstructorCompatTable() \
191 .set(alias, std::pair<::Foam::word,int>(k,ver)); \
196 template<class baseType##Type> \
197 struct add##argNames##ConstructorToTable \
199 static ptrWrapper<baseType> New argList \
201 return ptrWrapper<baseType>(new baseType##Type parList); \
204 explicit add##argNames##ConstructorToTable \
206 const ::Foam::word& k = baseType##Type::typeName \
209 argNames##ConstructorTablePtr_construct(true); \
210 if (!argNames##ConstructorTablePtr_->insert(k, New)) \
213 << "Duplicate entry " << k << " in runtime table " \
214 << #baseType << std::endl; \
215 ::Foam::error::safePrintStack(std::cerr); \
219 ~add##argNames##ConstructorToTable() \
221 argNames##ConstructorTablePtr_construct(false); \
224 add##argNames##ConstructorToTable \
225 (const add##argNames##ConstructorToTable&) = delete; \
228 (const add##argNames##ConstructorToTable&) = delete; \
233 template<class baseType##Type> \
234 struct addRemovable##argNames##ConstructorToTable \
236 const ::Foam::word name; \
238 static ptrWrapper<baseType> New argList \
240 return ptrWrapper<baseType>(new baseType##Type parList); \
243 explicit addRemovable##argNames##ConstructorToTable \
245 const ::Foam::word& k = baseType##Type::typeName \
250 argNames##ConstructorTablePtr_construct(true); \
251 argNames##ConstructorTablePtr_->set(k, New); \
254 ~addRemovable##argNames##ConstructorToTable() \
256 if (argNames##ConstructorTablePtr_) \
258 argNames##ConstructorTablePtr_->erase(name); \
262 addRemovable##argNames##ConstructorToTable \
263 (const addRemovable##argNames##ConstructorToTable&) = delete; \
266 (const addRemovable##argNames##ConstructorToTable&) = delete; \
271#define declareRunTimeNewSelectionTable\
272(ptrWrapper,baseType,argNames,argList,parList) \
274 declareRunTimeSelectionTableBase( \
275 ptrWrapper<baseType>,argNames##Constructor,argList); \
278 template<class baseType##Type> \
279 struct addAlias##argNames##ConstructorToTable \
281 explicit addAlias##argNames##ConstructorToTable \
283 const ::Foam::word& k, \
284 const ::Foam::word& alias, \
288 argNames##ConstructorCompatTable() \
289 .set(alias, std::pair<::Foam::word,int>(k,ver)); \
294 template<class baseType##Type> \
295 struct add##argNames##ConstructorToTable \
297 static ptrWrapper<baseType> New##baseType argList \
299 return ptrWrapper<baseType>(baseType##Type::New parList.ptr()); \
302 explicit add##argNames##ConstructorToTable \
304 const ::Foam::word& k = baseType##Type::typeName \
307 argNames##ConstructorTablePtr_construct(true); \
308 if (!argNames##ConstructorTablePtr_->insert(k, New##baseType)) \
311 << "Duplicate entry " << k << " in runtime table " \
312 << #baseType << std::endl; \
313 ::Foam::error::safePrintStack(std::cerr); \
317 ~add##argNames##ConstructorToTable() \
319 argNames##ConstructorTablePtr_construct(false); \
322 add##argNames##ConstructorToTable \
323 (const add##argNames##ConstructorToTable&) = delete; \
326 (const add##argNames##ConstructorToTable&) = delete; \
330 template<class baseType##Type> \
331 struct addRemovable##argNames##ConstructorToTable \
333 const ::Foam::word name; \
335 static ptrWrapper<baseType> New##baseType argList \
337 return ptrWrapper<baseType>(baseType##Type::New parList.ptr()); \
340 explicit addRemovable##argNames##ConstructorToTable \
342 const ::Foam::word& k = baseType##Type::typeName \
347 argNames##ConstructorTablePtr_construct(true); \
348 argNames##ConstructorTablePtr_->set(k, New##baseType); \
351 ~addRemovable##argNames##ConstructorToTable() \
353 if (argNames##ConstructorTablePtr_) \
355 argNames##ConstructorTablePtr_->erase(name); \
359 addRemovable##argNames##ConstructorToTable \
360 (const addRemovable##argNames##ConstructorToTable&) = delete; \
363 (const addRemovable##argNames##ConstructorToTable&) = delete; \
374#define defineRunTimeSelectionTable(baseType,argNames) \
376 defineRunTimeSelectionTableBase( \
377 baseType,baseType::argNames##Constructor,)
382#define defineTemplateRunTimeSelectionTable(baseType,argNames) \
384 defineRunTimeSelectionTableBase( \
385 baseType,baseType::argNames##Constructor,template<>)
390#define defineTemplatedRunTimeSelectionTable(baseType,argNames,Targ) \
392 defineRunTimeSelectionTableBase( \
393 baseType,baseType<Targ>::argNames##Constructor,template<>)
tmp< DimensionedField< TypeR, GeoMesh > > New(const tmp< DimensionedField< TypeR, GeoMesh > > &tdf1, const word &name, const dimensionSet &dimensions)
Global function forwards to reuseTmpDimensionedField::New.
word name(const expressions::valueTypeCode typeCode)
A word representation of a valueTypeCode. Empty for INVALID.
#define declareRunTimeSelectionTable(ptrWrapper, baseType, argNames, argList, parList)
Declare a run-time selection (variables and adder classes)
#define declareRunTimeSelectionTableBase(returnType, prefix, argList)
#define defineTemplateRunTimeSelectionTable(baseType, argNames)
Define run-time selection table for template classes.
dict add("bounds", meshBb)