mirror of
https://github.com/paboyle/Grid.git
synced 2025-04-09 21:50:45 +01:00
Hadrons: environment access to derived objects
This commit is contained in:
parent
b85f987b0b
commit
78f8d47528
@ -116,6 +116,10 @@ public:
|
|||||||
Ts && ... args);
|
Ts && ... args);
|
||||||
void setObjectModule(const unsigned int objAddress,
|
void setObjectModule(const unsigned int objAddress,
|
||||||
const int modAddress);
|
const int modAddress);
|
||||||
|
template <typename B, typename T>
|
||||||
|
T * getDerivedObject(const unsigned int address) const;
|
||||||
|
template <typename B, typename T>
|
||||||
|
T * getDerivedObject(const std::string name) const;
|
||||||
template <typename T>
|
template <typename T>
|
||||||
T * getObject(const unsigned int address) const;
|
T * getObject(const unsigned int address) const;
|
||||||
template <typename T>
|
template <typename T>
|
||||||
@ -186,7 +190,7 @@ Holder<T>::Holder(T *pt)
|
|||||||
template <typename T>
|
template <typename T>
|
||||||
T & Holder<T>::get(void) const
|
T & Holder<T>::get(void) const
|
||||||
{
|
{
|
||||||
return &objPt_.get();
|
return *objPt_.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
@ -231,7 +235,7 @@ void Environment::createDerivedObject(const std::string name,
|
|||||||
object_[address].Ls = Ls;
|
object_[address].Ls = Ls;
|
||||||
object_[address].data.reset(new Holder<B>(new T(std::forward<Ts>(args)...)));
|
object_[address].data.reset(new Holder<B>(new T(std::forward<Ts>(args)...)));
|
||||||
object_[address].size = MemoryProfiler::stats->maxAllocated - initMem;
|
object_[address].size = MemoryProfiler::stats->maxAllocated - initMem;
|
||||||
object_[address].type = &typeid(T);
|
object_[address].type = &typeid(B);
|
||||||
if (MemoryProfiler::stats == &memStats)
|
if (MemoryProfiler::stats == &memStats)
|
||||||
{
|
{
|
||||||
MemoryProfiler::stats = nullptr;
|
MemoryProfiler::stats = nullptr;
|
||||||
@ -241,7 +245,7 @@ void Environment::createDerivedObject(const std::string name,
|
|||||||
else if ((object_[address].storage != Storage::cache) or
|
else if ((object_[address].storage != Storage::cache) or
|
||||||
(object_[address].storage != storage) or
|
(object_[address].storage != storage) or
|
||||||
(object_[address].name != name) or
|
(object_[address].name != name) or
|
||||||
(object_[address].type != &typeid(T)))
|
(object_[address].type != &typeid(B)))
|
||||||
{
|
{
|
||||||
HADRON_ERROR(Definition, "object '" + name + "' already allocated");
|
HADRON_ERROR(Definition, "object '" + name + "' already allocated");
|
||||||
}
|
}
|
||||||
@ -256,21 +260,37 @@ void Environment::createObject(const std::string name,
|
|||||||
createDerivedObject<T, T>(name, storage, Ls, std::forward<Ts>(args)...);
|
createDerivedObject<T, T>(name, storage, Ls, std::forward<Ts>(args)...);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T>
|
template <typename B, typename T>
|
||||||
T * Environment::getObject(const unsigned int address) const
|
T * Environment::getDerivedObject(const unsigned int address) const
|
||||||
{
|
{
|
||||||
if (hasObject(address))
|
if (hasObject(address))
|
||||||
{
|
{
|
||||||
if (hasCreatedObject(address))
|
if (hasCreatedObject(address))
|
||||||
{
|
{
|
||||||
if (auto h = dynamic_cast<Holder<T> *>(object_[address].data.get()))
|
if (auto h = dynamic_cast<Holder<B> *>(object_[address].data.get()))
|
||||||
{
|
{
|
||||||
return h->getPt();
|
if (&typeid(T) == &typeid(B))
|
||||||
|
{
|
||||||
|
return dynamic_cast<T *>(h->getPt());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (auto hder = dynamic_cast<T *>(h->getPt()))
|
||||||
|
{
|
||||||
|
return hder;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
HADRON_ERROR(Definition, "object with address " + std::to_string(address) +
|
||||||
|
" cannot be casted to '" + typeName(&typeid(T)) +
|
||||||
|
"' (has type '" + typeName(&typeid(h->get())) + "')");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
HADRON_ERROR(Definition, "object with address " + std::to_string(address) +
|
HADRON_ERROR(Definition, "object with address " + std::to_string(address) +
|
||||||
" does not have type '" + typeName(&typeid(T)) +
|
" does not have type '" + typeName(&typeid(B)) +
|
||||||
"' (has type '" + getObjectType(address) + "')");
|
"' (has type '" + getObjectType(address) + "')");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -286,6 +306,18 @@ T * Environment::getObject(const unsigned int address) const
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename B, typename T>
|
||||||
|
T * Environment::getDerivedObject(const std::string name) const
|
||||||
|
{
|
||||||
|
return getDerivedObject<B, T>(getObjectAddress(name));
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
T * Environment::getObject(const unsigned int address) const
|
||||||
|
{
|
||||||
|
return getDerivedObject<T, T>(address);
|
||||||
|
}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
T * Environment::getObject(const std::string name) const
|
T * Environment::getObject(const std::string name) const
|
||||||
{
|
{
|
||||||
|
@ -91,6 +91,9 @@ static ns##mod##ModuleRegistrar ns##mod##ModuleRegistrarInstance;
|
|||||||
#define envGet(type, name)\
|
#define envGet(type, name)\
|
||||||
*env().template getObject<type>(name)
|
*env().template getObject<type>(name)
|
||||||
|
|
||||||
|
#define envGetDerived(base, type, name)\
|
||||||
|
*env().template getDerivedObject<base, type>(name)
|
||||||
|
|
||||||
#define envGetTmp(type, var)\
|
#define envGetTmp(type, var)\
|
||||||
type &var = *env().template getObject<type>(getName() + "_tmp_" + #var)
|
type &var = *env().template getObject<type>(getName() + "_tmp_" + #var)
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user