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 do_for_loop = [&](auto& result, auto& __idol_it, const auto& __idol_end) { \
41 for (++__idol_it ; __idol_it != __idol_end ; ++__idol_it) { \
42 auto INDEX = *__idol_it; \
43 result += EXPR; \
44 } \
45 }; \
46 \
47 const auto compute_sum = [&]() { \
48 const auto& __idol_iterable = ITERABLE; \
49 auto __idol_it = __idol_iterable.begin(); \
50 auto __idol_end = __idol_iterable.end(); \
51 auto INDEX = *__idol_it; \
52 decltype(EXPR + EXPR) result = EXPR; \
53 do_for_loop(result, __idol_it, __idol_end); \
54 return result; \
55 }; \
56 \
57 const auto& __idol_iterable = ITERABLE; \
58 auto __idol_it = __idol_iterable.begin(); \
59 auto __idol_end = __idol_iterable.end(); \
60 if (__idol_it != __idol_end) { \
61 return compute_sum(); \
62 } \
63 return decltype(compute_sum()){}; \
64}()
65
66
67#endif //IDOL_OPERATORS_UTILS_H