30 #ifndef CYPRESS_CORE_NETWORK_MIXINS_HPP 31 #define CYPRESS_CORE_NETWORK_MIXINS_HPP 49 template <
typename Impl,
typename Accessor>
50 class PopulationMixin {
52 Impl &impl() {
return reinterpret_cast<Impl &
>(*this); }
53 const Impl &impl()
const {
return reinterpret_cast<const Impl &
>(*this); }
57 std::shared_ptr<PopulationData> data()
const 66 const std::string &
name()
const {
return data()->name(); }
74 data()->name() =
name;
81 size_t size()
const {
return data()->size(); }
88 return data()->homogeneous_parameters();
102 template <
typename Impl>
105 Impl &impl() {
return reinterpret_cast<Impl &
>(*this); }
106 const Impl &impl()
const {
return reinterpret_cast<const Impl &
>(*this); }
118 template <
typename Impl,
typename Accessor>
121 Impl &impl() {
return reinterpret_cast<Impl &
>(*this); }
122 const Impl &impl()
const {
return reinterpret_cast<const Impl &
>(*this); }
142 template <
typename TargetIterator>
143 Impl &
connect_to(TargetIterator tar_begin, TargetIterator tar_end,
144 std::unique_ptr<Connector> connector,
const char *
name =
"")
146 network().connect(pid(), i0(), i1(), tar_begin->pid(), tar_begin->nid(),
147 tar_end->nid(), std::move(connector),
name);
160 template <
typename Target>
161 Impl &
connect_to(
const Target &tar, std::unique_ptr<Connector> connector,
const char *
name =
"")
163 return connect_to(tar.begin(), tar.end(), std::move(connector),
name);
171 template <
typename Impl,
typename Accessor,
typename Params,
typename Signals>
174 Impl &impl() {
return reinterpret_cast<Impl &
>(*this); }
175 const Impl &impl()
const {
return reinterpret_cast<const Impl &
>(*this); }
179 std::shared_ptr<PopulationData> data()
const 181 return network().population_data(pid());
187 template <
typename Other>
191 i0(), o.begin()->nid())(i1(), o.end()->nid())();
194 template <
typename Other>
198 i0(), o.begin()->nid())(i1(), o.end()->nid())();
201 template <
typename Other>
205 i0(), o.begin()->nid())(i1(), o.end()->nid())();
208 template <
typename Other>
212 i0(), o.begin()->nid())(i1(), o.end()->nid())();
215 template <
typename Other>
219 i0(), o.begin()->nid())(i1(), o.end()->nid())();
222 template <
typename Other>
226 i0(), o.begin()->nid())(i1(), o.end()->nid())();
240 const Params
parameters()
const {
return Params(data(), i0(), i1()); }
253 const Signals
signals()
const {
return Signals(data(), i0(), i1()); }
259 Signals
signals() {
return Signals(data(), i0(), i1()); }
267 template <
typename Impl,
typename View,
typename Accessor>
270 Impl &impl() {
return reinterpret_cast<Impl &
>(*this); }
271 const Impl &impl()
const {
return reinterpret_cast<const Impl &
>(*this); }
284 if (nid0 < i0() || nid1 > i1()) {
285 throw std::out_of_range(
286 "Range must be a subset of the source population range.");
306 check_range(i0() + begin, i0() + end);
307 return View(network(), pid(), i0() + begin, i0() + end);
322 check_range(i0() + begin, i0() + end);
323 return View(network(), pid(), i0() + begin, i0() + end);
338 return range(begin, end);
353 return range(begin, end);
362 template <
typename Impl,
typename Value,
typename Accessor>
376 template <
int Dir,
bool Const>
377 class iterator_ :
public std::iterator<std::random_access_iterator_tag,
378 Value, NeuronIndex, Value, Value> {
391 typename std::conditional<Const, Impl const *, Impl *>::type;
427 return m_idx * Dir < o.m_idx * Dir;
432 return m_idx * Dir > o.m_idx * Dir;
437 return m_idx * Dir <= o.m_idx * Dir;
442 return m_idx * Dir >= o.m_idx * Dir;
451 return (m_idx - o.m_idx) * Dir;
461 auto cpy =
Self(m_impl, m_idx);
474 auto cpy =
Self(m_impl, m_idx);
491 template <
typename U = Value,
492 typename =
typename std::enable_if<!Const, U>::type>
495 return Value(*m_impl, m_idx);
498 template <
typename U = Value,
499 typename =
typename std::enable_if<!Const, U>::type>
502 return Value(*m_impl, m_idx);
505 template <
typename U = Value,
506 typename =
typename std::enable_if<!Const, U>::type>
509 return Value(*m_impl, m_idx + n * Dir);
512 Value
operator*()
const {
return Value(*m_impl, m_idx); }
518 return Value(*m_impl, m_idx + n * Dir);
523 Impl *impl() {
return reinterpret_cast<Impl *
>(
this); }
524 const Impl *impl()
const {
return reinterpret_cast<const Impl *
>(
this); }
537 if (nid0 < i0() || nid1 > i1()) {
538 throw std::out_of_range(
539 "Range must be a subset of the source population range.");
565 return Value(*impl(), i0() + i);
581 return Value(*impl(), i0() + i);
588 size_t size() {
return i1() - i0(); }
Definition: neurons_base.hpp:54
bool operator>(const Self &o) const
Definition: network_mixins.hpp:430
NeuronIndex operator-(const Self &o) const
Definition: network_mixins.hpp:449
bool operator>=(const Other &o) const
Definition: network_mixins.hpp:223
bool operator<=(const Self &o) const
Definition: network_mixins.hpp:435
static auto smaller_equals(const T &t1, const T &t2)
Definition: comperator.hpp:95
Value operator()(NeuronIndex i)
Definition: network_mixins.hpp:573
Definition: network_base.hpp:67
static PopulationIndex pid(const PopulationBase &pop)
Definition: network_base_objects.hpp:244
iterator end()
Definition: network_mixins.hpp:599
int32_t NeuronIndex
Definition: types.hpp:74
Self operator-(NeuronIndex b)
Definition: network_mixins.hpp:447
std::shared_ptr< PopulationData > population_data(PopulationIndex pid)
Self & operator+=(NeuronIndex n)
Definition: network_mixins.hpp:479
Self operator--(int)
Definition: network_mixins.hpp:472
reverse_iterator rend()
Definition: network_mixins.hpp:603
constexpr Range< size_t > range(ptrdiff_t i)
Definition: range.hpp:85
iterator begin()
Definition: network_mixins.hpp:594
const_iterator cbegin() const
Definition: network_mixins.hpp:613
bool operator<(const Other &o) const
Definition: network_mixins.hpp:202
const Impl * operator->() const
Definition: network_mixins.hpp:110
static auto larger(const T &t1, const T &t2)
Definition: comperator.hpp:102
Definition: network_mixins.hpp:377
bool operator>(const Other &o) const
Definition: network_mixins.hpp:216
Definition: network_base.hpp:70
size_t size()
Definition: network_mixins.hpp:588
const_reverse_iterator rend() const
Definition: network_mixins.hpp:611
const Signals signals() const
Definition: network_mixins.hpp:253
const_reverse_iterator rbegin() const
Definition: network_mixins.hpp:609
Impl & name(const std::string &name)
Definition: network_mixins.hpp:72
const Value operator[](NeuronIndex i) const
Definition: network_mixins.hpp:563
Params parameters()
Definition: network_mixins.hpp:247
static auto equals(const T &t1, const T &t2)
Definition: comperator.hpp:116
Value operator[](NeuronIndex i)
Definition: network_mixins.hpp:557
Self & operator--()
Definition: network_mixins.hpp:466
Definition: network_mixins.hpp:103
Value operator*() const
Definition: network_mixins.hpp:512
static NeuronIndex end(const PopulationBase &pop)
Definition: network_base_objects.hpp:243
iterator_< 1, false > iterator
Definition: network_mixins.hpp:547
Impl & connect_to(TargetIterator tar_begin, TargetIterator tar_end, std::unique_ptr< Connector > connector, const char *name="")
Definition: network_mixins.hpp:143
bool operator==(const Self &o) const
Definition: network_mixins.hpp:421
const NeuronType & type() const
Definition: network_mixins.hpp:232
const_iterator cend() const
Definition: network_mixins.hpp:615
Value operator->()
Definition: network_mixins.hpp:500
Self operator++(int)
Definition: network_mixins.hpp:459
bool operator!=(const Self &o) const
Definition: network_mixins.hpp:423
Value operator[](NeuronIndex n) const
Definition: network_mixins.hpp:516
static auto smaller(const T &t1, const T &t2)
Definition: comperator.hpp:88
size_t size() const
Definition: network_mixins.hpp:81
bool operator<(const Self &o) const
Definition: network_mixins.hpp:425
iterator_< 1, true > const_iterator
Definition: network_mixins.hpp:548
bool operator>=(const Self &o) const
Definition: network_mixins.hpp:440
Self & operator-=(NeuronIndex n)
Definition: network_mixins.hpp:485
const Params parameters() const
Definition: network_mixins.hpp:240
bool operator!=(const Other &o) const
Definition: network_mixins.hpp:195
const View range(NeuronIndex begin, NeuronIndex end) const
Definition: network_mixins.hpp:304
Impl * operator->()
Definition: network_mixins.hpp:109
bool operator<=(const Other &o) const
Definition: network_mixins.hpp:209
View operator()(NeuronIndex begin, NeuronIndex end)
Definition: network_mixins.hpp:351
Self & operator++()
Definition: network_mixins.hpp:454
static NeuronIndex begin(const PopulationBase &)
Definition: network_base_objects.hpp:242
Value operator[](NeuronIndex n)
Definition: network_mixins.hpp:507
Definition: brainscales_lib.hpp:39
const std::string & name() const
Definition: network_mixins.hpp:66
Signals signals()
Definition: network_mixins.hpp:259
const Value operator()(NeuronIndex i) const
Definition: network_mixins.hpp:579
const_reverse_iterator crend() const
Definition: network_mixins.hpp:622
Definition: network_mixins.hpp:363
const View operator()(NeuronIndex begin, NeuronIndex end) const
Definition: network_mixins.hpp:336
const_reverse_iterator crbegin() const
Definition: network_mixins.hpp:617
const Impl & operator*() const
Definition: network_mixins.hpp:112
Self operator+(NeuronIndex b)
Definition: network_mixins.hpp:445
Impl & operator*()
Definition: network_mixins.hpp:111
reverse_iterator rbegin()
Definition: network_mixins.hpp:601
bool homogeneous_data() const
Definition: network_mixins.hpp:99
Definition: network_mixins.hpp:268
const_iterator end() const
Definition: network_mixins.hpp:607
View range(NeuronIndex begin, NeuronIndex end)
Definition: network_mixins.hpp:320
bool homogeneous_record() const
Definition: network_mixins.hpp:94
Value operator*()
Definition: network_mixins.hpp:493
int32_t PopulationIndex
Definition: types.hpp:75
Impl & connect_to(const Target &tar, std::unique_ptr< Connector > connector, const char *name="")
Definition: network_mixins.hpp:161
const_iterator begin() const
Definition: network_mixins.hpp:605
Value operator->() const
Definition: network_mixins.hpp:514
static auto inequal(const T &t1, const T &t2)
Definition: comperator.hpp:123
static NetworkBase network(const PopulationBase &pop)
Definition: network_base_objects.hpp:245
iterator_(ImplPtr impl, NeuronIndex idx)
Definition: network_mixins.hpp:411
static auto larger_equals(const T &t1, const T &t2)
Definition: comperator.hpp:109
iterator_<-1, false > reverse_iterator
Definition: network_mixins.hpp:549
bool operator==(const Other &o) const
Definition: network_mixins.hpp:188
iterator_<-1, true > const_reverse_iterator
Definition: network_mixins.hpp:550
bool homogeneous_parameters() const
Definition: network_mixins.hpp:86