1 #ifndef SKYLINE_INTERFACE_HPP
2 #define SKYLINE_INTERFACE_HPP
4 #include "../instance/job.hpp"
5 #include "../instance/resource.hpp"
11 #include <type_traits>
14 #include "skyline.hpp"
17 using dyno::literals::operator
""_s;
19 struct SkyLineIteratorInterface
20 : decltype(::dyno::requires(
21 dyno::CopyConstructible{}, dyno::CopyAssignable{},
22 dyno::Destructible{}, dyno::EqualityComparable{},
23 dyno::DefaultConstructible{},
25 "operator++_prefix"_s = ::dyno::method<void()>,
26 "operator++_postfix"_s = ::dyno::method<void(int)>,
27 "operator--_prefix"_s = ::dyno::method<void()>,
28 "operator--_postfix"_s = ::dyno::method<void(int)>,
29 "dereference"_s = ::dyno::method<const SkyLineEvent &()>))
36 struct SkyLineInterface
37 : decltype(::dyno::requires(
38 dyno::MoveConstructible{},
39 "remove_job__job"_s = ::dyno::method<void(const Job &)>,
40 "remove_job__jid"_s = ::dyno::method<void(Job::JobId)>,
42 ::dyno::method<void(const Job &, unsigned int pos)>,
44 ::dyno::method<void(const Job::JobId, unsigned int pos)>,
46 "set_pos__job"_s = dyno::method<void(const Job &, unsigned int)>,
47 "set_pos__jid"_s = dyno::method<void(Job::JobId, unsigned int)>,
49 "get_maximum__unbounded"_s = dyno::method<Resources()>,
50 "get_maximum__bounded"_s =
51 dyno::method<Resources(unsigned int, unsigned int)>,
53 "get_maximum_range__unbounded"_s = dyno::method<MaxRange() const>,
54 "get_maximum_range__bounded"_s =
55 dyno::method<MaxRange(unsigned int, unsigned int) const>,
57 "begin"_s = dyno::method<SkyLineIterator()>,
58 "end"_s = dyno::method<SkyLineIterator()>,
60 "lower_bound"_s = dyno::method<SkyLineIterator(unsigned int)>,
61 "upper_bound"_s = dyno::method<SkyLineIterator(unsigned int)>))
73 auto const dyno::default_concept_map<ds::SkyLineIteratorInterface, T> =
74 dyno::make_concept_map(
"operator++_prefix"_s = [](T &
self) { ++
self; },
75 "operator++_postfix"_s =
76 [](T &
self,
int dummy) {
80 "operator--_prefix"_s = [](T &
self) { --
self; },
81 "operator--_postfix"_s =
82 [](T &
self,
int dummy) {
86 "dereference"_s = [](T &
self)
87 ->
const ds::SkyLineEvent & {
return *
self; });
96 dyno::default_concept_map<ds::SkyLineInterface, T> = dyno::make_concept_map(
97 "remove_job__job"_s = [](T &
self,
98 const Job & job) {
self.remove_job(job); },
99 "remove_job__jid"_s = [](T &
self,
100 Job::JobId jid) {
self.remove_job(jid); },
101 "insert_job__job"_s =
102 [](T &
self,
const Job & job,
unsigned int pos) {
103 self.insert_job(job, pos);
105 "insert_job__jid"_s =
106 [](T &
self, Job::JobId jid,
unsigned int pos) {
107 self.insert_job(jid, pos);
109 "set_pos__job"_s = [](T &
self,
const Job & job,
110 unsigned int pos) {
self.set_pos(job, pos); },
111 "set_pos__jid"_s = [](T &
self, Job::JobId jid,
112 unsigned int pos) {
self.set_pos(jid, pos); },
113 "get_maximum__unbounded"_s =
114 [](T &
self) {
return self.get_maximum(); },
115 "get_maximum__bounded"_s =
116 [](T &
self,
unsigned int lb,
unsigned int ub) {
117 return self.get_maximum(lb, ub);
119 "get_maximum_range__unbounded"_s =
120 [](
const T &
self) {
return self.get_maximum_range(); },
121 "get_maximum_range__bounded"_s =
122 [](
const T &
self,
unsigned int lb,
unsigned int ub) {
123 return self.get_maximum_range(lb, ub);
125 "begin"_s = [](T &
self) {
return ds::SkyLineIterator(
self.begin()); },
126 "end"_s = [](T &
self) {
return ds::SkyLineIterator(
self.end()); },
127 "lower_bound"_s = [](T &
self,
128 unsigned int x) {
return self.lower_bound(x); },
129 "upper_bound"_s = [](T &
self,
130 unsigned int x) {
return self.upper_bound(x); }
138 class SkyLineIterator {
140 typedef std::ptrdiff_t difference_type;
141 typedef SkyLineEvent value_type;
142 typedef const SkyLineEvent & reference;
143 typedef const SkyLineEvent * pointer;
144 typedef std::forward_iterator_tag iterator_category;
147 SkyLineIterator(T x) : poly_(x)
150 SkyLineIterator(
const SkyLineIterator & other) : poly_(other.poly_) {}
153 operator=(
const SkyLineIterator other)
155 this->poly_ = other.poly_;
162 this->poly_.virtual_(
"operator++_prefix"_s)();
169 SkyLineIterator cpy = *
this;
170 this->poly_.virtual_(
"operator++_postfix"_s)(0);
174 const SkyLineEvent & operator*()
176 return this->poly_.virtual_(
"dereference"_s)();
180 operator==(
const SkyLineIterator & lhs,
const SkyLineIterator & rhs)
185 return lhs.poly_.virtual_(
"equal"_s)(lhs.poly_, rhs.poly_);
189 operator!=(
const SkyLineIterator & other)
191 return !(*
this == other);
195 swap(SkyLineIterator & other)
197 std::swap(this->poly_, other.poly_);
201 swap(SkyLineIterator & a, SkyLineIterator & b)
207 dyno::poly<SkyLineIteratorInterface,
208 dyno::local_storage<std::max(
209 sizeof(ArraySkyLineBase<true>::iterator),
210 sizeof(TreeSkyLineBase<true, false>::iterator))>,
211 dyno::vtable<dyno::local<dyno::everything>>>
222 SkyLine(T && x) : poly_(std::move(x))
226 remove_job(
const Job & job) noexcept
228 poly_.virtual_(
"remove_job__job"_s)(job);
232 remove_job(Job::JobId jid) noexcept
234 poly_.virtual_(
"remove_job__jid"_s)(jid);
238 insert_job(
const Job & job,
unsigned int pos) noexcept
240 poly_.virtual_(
"insert_job__job"_s)(job, pos);
244 insert_job(Job::JobId jid,
unsigned int pos) noexcept
246 poly_.virtual_(
"insert_job__jid"_s)(jid, pos);
250 set_pos(
const Job & job,
unsigned int pos) noexcept
252 poly_.virtual_(
"set_pos__job"_s)(job, pos);
256 set_pos(Job::JobId jid,
int pos) noexcept
258 poly_.virtual_(
"set_pos__jid"_s)(jid, pos);
262 get_maximum() noexcept
264 return poly_.virtual_(
"get_maximum__unbounded"_s)();
268 get_maximum(
unsigned int lb,
unsigned int ub) noexcept
270 return poly_.virtual_(
"get_maximum__bounded"_s)(lb, ub);
274 get_maximum_range() const noexcept
276 return poly_.virtual_(
"get_maximum_range__unbounded"_s)();
280 get_maximum_range(
unsigned int lb,
unsigned int ub)
const noexcept
282 return poly_.virtual_(
"get_maximum_range__bounded"_s)(lb, ub);
288 return SkyLineIterator(poly_.virtual_(
"begin"_s)());
294 return SkyLineIterator(poly_.virtual_(
"end"_s)());
298 lower_bound(
unsigned int x) noexcept
300 return SkyLineIterator(poly_.virtual_(
"lower_bound"_s)(x));
304 upper_bound(
unsigned int x) noexcept
306 return SkyLineIterator(poly_.virtual_(
"upper_bound"_s)(x));
312 dyno::local_storage<std::max(
sizeof(ArraySkyLineBase<true>),
313 sizeof(TreeSkyLineBase<true, false>))>,
314 dyno::vtable<dyno::local<dyno::everything>>>