Program Listing for File ImplSpec.hpp

Return to documentation for file (include/uit/setup/ImplSpec.hpp)

#pragma once
#ifndef UIT_SETUP_IMPLSPEC_HPP_INCLUDE
#define UIT_SETUP_IMPLSPEC_HPP_INCLUDE

#include "defaults.hpp"
#include "ImplSelect.hpp"

namespace uit {

namespace internal {

template<
  typename T_,
  typename ImplSelect,
  size_t N_,
  size_t B_
>
class ImplSpecKernel {

  using THIS_T = ImplSpecKernel<T_, ImplSelect, N_, B_>;

public:

  using T = T_;

  constexpr inline static size_t N{ N_ };

  constexpr inline static size_t B{ B_ };

  using IntraDuct = typename ImplSelect::template IntraDuct<THIS_T>;

  using ThreadDuct = typename ImplSelect::template ThreadDuct<THIS_T>;

  using ProcInletDuct = typename ImplSelect::template
    ProcDuct<THIS_T>::InletImpl;

  using ProcOutletDuct = typename ImplSelect::template
    ProcDuct<THIS_T>::OutletImpl;

  using ProcBackEnd = typename ImplSelect::template
    ProcDuct<THIS_T>::BackEndImpl;

  // TODO add static ToString

};

} // namespace internal

template<
  typename T,
  typename ImplSelect=uit::ImplSelect<>,
  template<typename> typename SpoutWrapper=uit::DefaultSpoutWrapper,
  size_t N=uit::DEFAULT_BUFFER,
  size_t B=std::numeric_limits<size_t>::max(),
  size_t SpoutCacheSize_=2
>
class ImplSpec
: public internal::ImplSpecKernel<
  typename SpoutWrapper<T>::T,
  ImplSelect, N, B
> {

  using wrapper_t = SpoutWrapper<T>;

public:

  using value_type = T;

  template<typename Inlet>
  using inlet_wrapper_t = typename wrapper_t::template inlet_wrapper_t<Inlet>;

  template<typename Outlet>
  using outlet_wrapper_t
    = typename wrapper_t::template outlet_wrapper_t<Outlet>;

  constexpr inline static size_t SpoutCacheSize{ SpoutCacheSize_ };

};

template<typename T>
struct MockSpec
: public ImplSpec<T, uit::MockSelect>
{};

} // namespace uit

#endif // #ifndef UIT_SETUP_IMPLSPEC_HPP_INCLUDE