24 template <
typename CoordinateT,
typename ContainerT>
25 auto operator()(CoordinateT
const& coord, ContainerT
const& container)
26 -> decltype(container.addresses(coord),
void())
28 auto const read_addresses = container.addresses(coord);
32 template <
typename CoordinateT,
typename ContainerT>
33 auto operator()(CoordinateT
const& coord, ContainerT
const& container)
34 -> decltype(container.read_addresses(coord),
void())
36 auto const read_addresses = container.read_addresses(coord);
40 template <
typename CoordinateT,
typename ContainerT>
41 auto operator()(CoordinateT
const& coord, ContainerT
const& container)
42 -> decltype(container.template addresses<typename T::value_type>(coord),
void())
44 auto const read_addresses = container.template addresses<typename T::value_type>(coord);
48 template <
typename CoordinateT,
typename ContainerT>
49 auto operator()(CoordinateT
const& coord, ContainerT
const& container)
50 -> decltype(container.template read_addresses<typename T::value_type>(coord),
void())
52 auto const read_addresses =
53 container.template read_addresses<typename T::value_type>(coord);
57 template <
typename CoordinateT,
typename ContainerT>
58 auto operator()(CoordinateT
const&, ContainerT
const&) ->
59 typename std::enable_if<!ContainerT::has_local_data::value>::type
78 template <
typename CoordinateT,
typename ContainerT>
79 auto operator()(CoordinateT
const& coord, ContainerT
const& container)
80 -> decltype(container.addresses(coord),
void())
82 auto const write_addresses = container.addresses(coord);
86 template <
typename CoordinateT,
typename ContainerT>
87 auto operator()(CoordinateT
const& coord, ContainerT
const& container)
88 -> decltype(container.write_addresses(coord),
void())
90 auto const write_addresses = container.write_addresses(coord);
94 template <
typename CoordinateT,
typename ContainerT>
95 auto operator()(CoordinateT
const& coord, ContainerT
const& container)
96 -> decltype(container.template addresses<typename T::value_type>(coord),
void())
98 auto const write_addresses = container.template addresses<typename T::value_type>(coord);
102 template <
typename CoordinateT,
typename ContainerT>
103 auto operator()(CoordinateT
const& coord, ContainerT
const& container)
104 -> decltype(container.template write_addresses<typename T::value_type>(coord),
void())
106 auto const write_addresses =
107 container.template write_addresses<typename T::value_type>(coord);
111 template <
typename CoordinateT,
typename ContainerT>
113 typename std::enable_if<!ContainerT::has_local_data::value>::type
130 template <
typename T>
134 typedef typename T::value_type value_type;
135 typename T::const_iterator m_it;
140 template <
typename CoordinateT,
typename ContainerT>
141 auto operator()(CoordinateT
const& coord, ContainerT& container)
142 -> decltype(&ContainerT::decode,
void())
144 decode(coord, container, &ContainerT::decode);
147 template <
typename CoordinateT,
typename ContainerT>
148 auto operator()(CoordinateT
const& coord, ContainerT& container)
149 -> decltype(&ContainerT::template decode<value_type>,
void())
151 decode(coord, container, &ContainerT::template decode<value_type>);
154 template <
typename CoordinateT,
typename ContainerT>
156 typename std::enable_if<!ContainerT::has_local_data::value>::type
162 template <
typename CoordinateT,
typename ContainerT,
typename DecodeContainerT,
size_t N>
164 CoordinateT
const& coord,
165 ContainerT& container,
166 void (DecodeContainerT::*decode)(CoordinateT
const&, std::array<value_type, N>
const&))
168 (container.*decode)(coord, slice<N>());
171 template <
typename CoordinateT,
typename ContainerT,
typename DecodeContainerT,
size_t N>
174 ContainerT& container,
175 void (DecodeContainerT::*decode)(std::array<value_type, N>
const&))
177 (container.*decode)(slice<N>());
181 auto slice() -> std::array<value_type, N>
184 throw std::runtime_error(
"end of buffer during decoding");
186 std::array<value_type, N> buf;
189 std::advance(m_it, N);
190 std::copy(prev_it, m_it, buf.begin());
195 size_t remaining()
const {
return std::distance(m_it, m_data.cend()); }
210 template <
typename T>
214 typedef typename T::value_type value_type;
219 template <
typename CoordinateT,
typename ContainerT>
220 auto operator()(CoordinateT
const& coord, ContainerT
const& container)
221 -> decltype(&ContainerT::encode,
void())
223 encode(coord, container, &ContainerT::encode);
226 template <
typename CoordinateT,
typename ContainerT>
227 auto operator()(CoordinateT
const& coord, ContainerT
const& container)
228 -> decltype(&ContainerT::template encode<value_type>,
void())
230 encode(coord, container, &ContainerT::template encode<value_type>);
233 template <
typename CoordinateT,
typename ContainerT>
235 typename std::enable_if<!ContainerT::has_local_data::value>::type
241 template <
typename CoordinateT,
typename ContainerT,
size_t N>
243 CoordinateT
const& coord,
244 ContainerT
const& container,
245 std::array<value_type, N> (ContainerT::*encode)(CoordinateT
const&)
const)
247 auto const words = (container.*encode)(coord);
248 m_data.insert(m_data.end(), words.begin(), words.end());
251 template <
typename CoordinateT,
typename ContainerT,
size_t N>
254 ContainerT
const& container,
255 std::array<value_type, N> (ContainerT::*encode)()
const)
257 auto const words = (container.*encode)();
258 m_data.insert(m_data.end(), words.begin(), words.end());
261 template <
typename CoordinateT,
typename ContainerT>
263 CoordinateT
const& coord,
264 ContainerT
const& container,
265 decltype(container.template encode<value_type>(coord)) (ContainerT::*encode)(
266 CoordinateT
const&)
const)
268 auto const words = (container.*encode)(coord);
269 m_data.insert(m_data.end(), words.begin(), words.end());
272 template <
typename CoordinateT,
typename ContainerT>
275 ContainerT
const& container,
276 decltype(container.template encode<value_type>()) (ContainerT::*encode)()
const)
278 auto const words = (container.*encode)();
279 m_data.insert(m_data.end(), words.begin(), words.end());
Fill the visited containers by decoding the specified configuration data.
auto operator()(CoordinateT const &coord, ContainerT &container) -> decltype(&ContainerT::decode, void())
auto operator()(CoordinateT const &coord, ContainerT &container) -> decltype(&ContainerT::template decode< value_type >, void())
auto operator()(CoordinateT const &, ContainerT const &) -> typename std::enable_if<!ContainerT::has_local_data::value >::type
Extract hardware configuration data for the visited containers.
auto operator()(CoordinateT const &coord, ContainerT const &container) -> decltype(&ContainerT::template encode< value_type >, void())
auto operator()(CoordinateT const &coord, ContainerT const &container) -> decltype(&ContainerT::encode, void())
auto operator()(CoordinateT const &, ContainerT const &) -> typename std::enable_if<!ContainerT::has_local_data::value >::type
Extract addresses for reading from hardware for the visited containers.
auto operator()(CoordinateT const &coord, ContainerT const &container) -> decltype(container.addresses(coord), void())
auto operator()(CoordinateT const &, ContainerT const &) -> typename std::enable_if<!ContainerT::has_local_data::value >::type
auto operator()(CoordinateT const &coord, ContainerT const &container) -> decltype(container.read_addresses(coord), void())
auto operator()(CoordinateT const &coord, ContainerT const &container) -> decltype(container.template addresses< typename T::value_type >(coord), void())
auto operator()(CoordinateT const &coord, ContainerT const &container) -> decltype(container.template read_addresses< typename T::value_type >(coord), void())
Extract addresses for writing to hardware for the visited containers.
auto operator()(CoordinateT const &coord, ContainerT const &container) -> decltype(container.addresses(coord), void())
auto operator()(CoordinateT const &coord, ContainerT const &container) -> decltype(container.template write_addresses< typename T::value_type >(coord), void())
auto operator()(CoordinateT const &, ContainerT const &) -> typename std::enable_if<!ContainerT::has_local_data::value >::type
auto operator()(CoordinateT const &coord, ContainerT const &container) -> decltype(container.template addresses< typename T::value_type >(coord), void())
auto operator()(CoordinateT const &coord, ContainerT const &container) -> decltype(container.write_addresses(coord), void())