idol
A C++ Framework for Optimization
Loading...
Searching...
No Matches
operators_utils.h
1//
2// Created by henri on 17/11/22.
3//
4
5#ifndef IDOL_OPERATORS_UTILS_H
6#define IDOL_OPERATORS_UTILS_H
7
8namespace idol {
9 template<class NumT>
10 class Range;
11}
12
13template<class NumT>
15 const NumT m_begin;
16 const NumT m_end;
17public:
18 explicit Range(NumT t_end) : m_begin(0), m_end(t_end) {}
19 Range(NumT t_begin, NumT t_end) : m_begin(t_begin), m_end(t_end) {}
20
21 class iterator {
22 friend class Range<NumT>;
23 NumT m_index;
24 explicit iterator(NumT t_index) : m_index(t_index) {}
25 public:
26 bool operator!=(const iterator& t_it) const { return t_it.m_index != m_index; }
27 bool operator==(const iterator& t_it) const { return t_it.m_index == m_index; }
28 iterator& operator++() { ++m_index; return *this; }
29 iterator operator++(int) & { auto result = *this; ++m_index; return *this; }
30 NumT operator*() const { return m_index; }
31 NumT* operator->() const { return &m_index; }
32 };
33
34 [[nodiscard]] iterator begin() const { return iterator(m_begin); }
35 [[nodiscard]] iterator end() const { return iterator(m_end); }
36};
37
38#define idol_Sum(INDEX, ITERABLE, EXPR) \
39[&]() { \
40 const auto compute_sum = [&]() { \
41 const auto& __idol_iterable = ITERABLE; \
42 auto __idol_it = __idol_iterable.begin(); \
43 auto __idol_end = __idol_iterable.end(); \
44 auto INDEX = *__idol_it; \
45 decltype(EXPR + EXPR) result = EXPR; \
46 for (++__idol_it ; __idol_it != __idol_end ; ++__idol_it) { \
47 INDEX = *__idol_it; \
48 result += EXPR; \
49 } \
50 return result; \
51 }; \
52 \
53 const auto& __idol_iterable = ITERABLE; \
54 auto __idol_it = __idol_iterable.begin(); \
55 auto __idol_end = __idol_iterable.end(); \
56 if (__idol_it != __idol_end) { \
57 return compute_sum(); \
58 } \
59 return decltype(compute_sum()){}; \
60}()
61
62
63#endif //IDOL_OPERATORS_UTILS_H