Adapter Cyclic Implementation - GerdHirsch/Cpp-VisitorFrameworkCyclicAcyclic GitHub Wiki
The Repository generates the application specific Adapters with the parameters,
the repository is created: using VisitableAdapter =
.
template<class LoggingPolicy, class BaseKind_, class ...Visitables>
struct Repository{
using VisitorBase = ...
...
template<class Adaptee, class StoragePolicy>
using VisitableAdapter =
Cyclic::VisitableAdapter<Adaptee, StoragePolicy, LoggingPolicy, VisitorBase>;
// Convenience Interfaces
template<class Adaptee>
using AdapterByWeakpointer =
VisitableAdapter<Adaptee, StorageByWeakpointer<Adaptee>>;
template<class Adaptee>
using AdapterByReference =
VisitableAdapter<Adaptee, StorageByReference<Adaptee>>;
...
LoggingPolicy
and VisitorBase
is used as arguments from Repository
. The convenience interfaces define in addition, a StoragePolicy
.
namespace Cyclic{
template
<
class Adaptee,
class StoragePolicy,
class LoggingPolicy,
class VisitorBase
>
struct VisitableAdapter :
VisitableImpl<
Adaptee,
VisitorBase,
LoggingPolicy,
VisitableAdapter<Adaptee, StoragePolicy, LoggingPolicy, VisitorBase>>,
StoragePolicy
{
using StorageType = typename StoragePolicy::StorageType;
using ReturnType = typename StoragePolicy::ReturnType;
using ConstReturnType = typename StoragePolicy::ConstReturnType;
VisitableAdapter(StorageType element): StoragePolicy(element){}
ReturnType getVisitable() { return this->get(); }
ConstReturnType getVisitable() const { return this->get(); }
std::string toString() const {
std::string message("CyclicAdapter::");
message += this->getVisitable()->toString();
return message;
}
};
} //namespace
The VisitableAdapter
inherits from VisitableImpl<..>
and from the StoragePolicy
. It uses the StoragePolicy to store the Adaptee
. It provides a getVisitable()
method, which is used from VisitableImpl<..>::accept(..)
.