// policy templates //////////////////////////////////////////////////
template < class T >
struct SingleThread
{
// implementation
};
template < class T >
struct ClassLocking
{
// implementation
};
// tag harness for the policy classes ////////////////////////////////
struct ThreadingPolicyTag {};
template < class Tag, class T > struct ThreadingPolicy;
struct SingleThreadTag : ThreadingPolicyTag {};
template < class T >
struct ThreadingPolicy< SingleThreadTag, T > : SingleThread< T > {};
struct ClassLockingTag : ThreadingPolicyTag {};
template < class T >
struct ThreadingPolicy< ClassLockingTag, T > : ClassLocking< T > {};
// policy selection tool: ////////////////////////////////////////////
template < class TagList,
class TagRoot,
class DefaultTag
>
struct SelectPolicyTag
{
typedef DefaultTag Result;
};
template < class Head,
class Tail,
class TagRoot,
class DefaultTag
>
struct SelectPolicyTag< Typelist< Head, Tail >,
TagRoot,
DefaultTag
>
{
typedef Select < SUPERSUBCLASS( TagRoot, Head ),
Head,
SelectPolicyTag< Tail,
TagRoot,
DefaultTag
>::Result
>::Result
Result;
};
// finally, FixedSizeArray implementation ////////////////////////////
template < class T, class PolicyTagList = NullType >
class FixedSizeArray {
typedef ThreadingPolicy < SelectPolicyTag < PolicyTagList,
ThreadingPolicyTag,
SingleThreadTag
>::Result,
T
> MyThreadingPolicy;
};
End of Listing