Skip to content

Commit 0437517

Browse files
committed
[update] macros for work with many number types
1 parent ebe29ca commit 0437517

File tree

12 files changed

+108
-70
lines changed

12 files changed

+108
-70
lines changed

include/ekg/core/pools.hpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -51,25 +51,25 @@ namespace ekg::core {
5151
void registry(ekg::property_t &property);
5252
}
5353

54-
#define ekg_core_declare_widget_case_todo(descriptor_t, widget_descriptor_at, ekg_core_widget_todo) \
54+
#define ekg_core_widget_call_impl(descriptor_t, widget_descriptor_at, todo) \
5555
case descriptor_t::type: { \
5656
descriptor_t &descriptor { \
5757
ekg::query<descriptor_t>(widget_descriptor_at) \
5858
}; \
5959
if (descriptor == descriptor_t::not_found) { \
6060
break; \
6161
} \
62-
ekg_core_widget_todo \
62+
todo \
6363
break; \
6464
}
6565

66-
#define ekg_core_abstract_todo(widget_descriptor_type, widget_descriptor_at, ekg_core_widget_todo) \
66+
#define ekg_core_widget_call(widget_descriptor_type, widget_descriptor_at, todo) \
6767
switch (widget_descriptor_type) { \
68-
ekg_core_declare_widget_case_todo(ekg::frame_t, widget_descriptor_at, ekg_core_widget_todo); \
69-
ekg_core_declare_widget_case_todo(ekg::button_t, widget_descriptor_at, ekg_core_widget_todo); \
70-
ekg_core_declare_widget_case_todo(ekg::label_t, widget_descriptor_at, ekg_core_widget_todo); \
71-
ekg_core_declare_widget_case_todo(ekg::scrollbar_t, widget_descriptor_at, ekg_core_widget_todo); \
72-
ekg_core_declare_widget_case_todo(ekg::slider_t, widget_descriptor_at, ekg_core_widget_todo); \
68+
ekg_core_widget_call_impl(ekg::frame_t, widget_descriptor_at, todo); \
69+
ekg_core_widget_call_impl(ekg::button_t, widget_descriptor_at, todo); \
70+
ekg_core_widget_call_impl(ekg::label_t, widget_descriptor_at, todo); \
71+
ekg_core_widget_call_impl(ekg::scrollbar_t, widget_descriptor_at, todo); \
72+
ekg_core_widget_call_impl(ekg::slider_t, widget_descriptor_at, todo); \
7373
}
7474

7575
#define ekg_registry_widget(widget_descriptor_t, register_widget_pool, register_property_pool, is_container, register_settings) \

include/ekg/io/memory.hpp

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,12 @@ namespace ekg {
7171
constexpr ekg::flags_t &put(ekg::flags_t &bits, t bit) {
7272
return (bits |= bit);
7373
}
74+
75+
constexpr void assert(bool state, const char *p_msg = "") {
76+
if (state) return;
77+
if (p_msg) std::cout << "[EKG] assert failed: " << p_msg;
78+
std::abort();
79+
}
7480
}
7581

7682
/**
@@ -184,6 +190,7 @@ namespace ekg {
184190
t *p {nullptr};
185191
t previous {};
186192
bool changed {};
193+
size_t type_info_hash {};
187194
public:
188195
value() {
189196
this->ownership(nullptr);
@@ -193,20 +200,30 @@ namespace ekg {
193200
this->ownership(p_address);
194201
this->changed = true;
195202
}
203+
204+
template<typename s>
205+
value(s val) {
206+
this->as<s>() = ekg::io::any_static_cast<s>(&val);
207+
this->changed = true;
208+
this->type_info_hash = typeid(s).hash_code();
209+
}
196210

197211
value(t val) {
198212
this->get() = val;
199213
this->changed = true;
214+
this->type_info_hash = typeid(t).hash_code();
200215
}
201216

202217
value(const char *p_char) {
203218
this->get() = p_char;
204219
this->changed = true;
220+
this->type_info_hash = typeid(t).hash_code();
205221
}
206222

207223
bool set(const t &val) {
208224
this->get() = val;
209225
this->changed = true;
226+
this->type_info_hash = typeid(t).hash_code();
210227
return true;
211228
}
212229

@@ -217,6 +234,7 @@ namespace ekg {
217234
template<typename s>
218235
void ownership(s *p_address) {
219236
ownership(ekg::io::any_static_cast_as_ptr<t>(p_address));
237+
this->type_info_hash = typeid(s).hash_code();
220238
}
221239

222240
void ownership(t *p_address) {
@@ -242,10 +260,21 @@ namespace ekg {
242260

243261
return false;
244262
}
263+
264+
template<typename s>
265+
s &as() {
266+
this->type_info_hash = typeid(s).hash_code();
267+
return ekg::io::any_static_cast<s>(this->get());
268+
}
269+
270+
size_t &get_type_info_hash() {
271+
return this->type_info_hash;
272+
}
245273
public:
246274
template<typename s>
247-
ekg::value<t> &operator = (const s &val) {
248-
this->get() = val;
275+
ekg::value<t> &operator = (s val) {
276+
this->type_info_hash = typeid(s).hash_code();
277+
this->get() = ekg::io::any_static_cast<t>(&val);
249278
this->changed = true;
250279
return *this;
251280
}

include/ekg/ui/slider/slider.hpp

Lines changed: 7 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -43,50 +43,13 @@ namespace ekg {
4343

4444
struct slider_t {
4545
public:
46-
struct range {
47-
protected:
48-
ekg::value<char[8]> memory_tape_value {};
49-
ekg::value<char[8]> memory_tape_minimum_value {};
50-
ekg::value<char[8]> memory_tape_maximum_value {};
46+
struct range_t {
5147
public:
52-
template<typename t>
53-
t &value() {
54-
return ekg::io::any_static_cast<t>(
55-
this->memory_tape_value.get()
56-
);
57-
}
58-
59-
template<typename t>
60-
t &value(t *p_ownership_address) {
61-
this->memory_tape_value.ownership<t>(p_ownership_address);
62-
return this->value<t>();
63-
}
64-
65-
template<typename t>
66-
t &min() {
67-
return ekg::io::any_static_cast<t>(
68-
this->memory_tape_minimum_value.get()
69-
);
70-
}
71-
72-
template<typename t>
73-
t &min(t *p_ownership_address) {
74-
this->memory_tape_minimum_value.ownership<t>(p_ownership_address);
75-
return this->min<t>();
76-
}
77-
78-
template<typename t>
79-
t &max() {
80-
return ekg::io::any_static_cast<t>(
81-
this->memory_tape_maximum_value.get()
82-
);
83-
}
84-
85-
template<typename t>
86-
t &max(t *p_ownership_address) {
87-
this->memory_tape_maximum_value.ownership<t>(p_ownership_address);
88-
return this->max<t>();
89-
}
48+
ekg::value<char[8]> value {};
49+
ekg::value<char[8]> min {};
50+
ekg::value<char[8]> max {};
51+
ekg::flags_t dock {ekg::dock::left};
52+
ekg::flags_t dock_text {ekg::dock::center};
9053
};
9154
public:
9255
static constexpr ekg::type type {ekg::type::slider};
@@ -97,7 +60,7 @@ namespace ekg {
9760
std::string tag {};
9861
ekg::rect_t<float> rect {};
9962
ekg::flags_t dock {};
100-
std::vector<ekg::slider_t::range> ranges {};
63+
std::vector<ekg::slider_t::range_t> ranges {};
10164
ekg::slider_color_scheme_t color_scheme {};
10265
public:
10366
ekg_descriptor(ekg::slider_t);

include/ekg/ui/slider/widget.hpp

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,46 @@
2828
#include "ekg/ui/property.hpp"
2929
#include "ekg/io/event.hpp"
3030

31+
namespace ekg::ui {
32+
static const size_t f64 {typeid(double).hash_code()};
33+
static const size_t f32 {typeid(float).hash_code()};
34+
static const size_t i64 {typeid(int64_t).hash_code()};
35+
static const size_t u64 {typeid(uint64_t).hash_code()};
36+
static const size_t i32 {typeid(int32_t).hash_code()};
37+
static const size_t u32 {typeid(uint32_t).hash_code()};
38+
static const size_t i16 {typeid(int16_t).hash_code()};
39+
static const size_t u16 {typeid(uint16_t).hash_code()};
40+
static const size_t i8 {typeid(int8_t).hash_code()};
41+
static const size_t u8 {typeid(uint8_t).hash_code()};
42+
}
43+
44+
/**
45+
* This make easily the part of adding tasks like: drag, draw, etc.
46+
**/
47+
#define ekg_ui_slider_range_task_impl(ekg_ui_slider_range, number_t_hash, number_t, todo) \
48+
if (hash == number_t_hash) { \
49+
number_t &value {ekg_ui_slider_range.value.as<number_t>()}; \
50+
number_t &min {ekg_ui_slider_range.min.as<number_t>()}; \
51+
number_t &max {ekg_ui_slider_range.max.as<number_t>()}; \
52+
todo; \
53+
}
54+
55+
/**
56+
* This provides a map for most all number-types.
57+
**/
58+
#define ekg_ui_slider_range_task(ekg_ui_slider_range, todo) \
59+
const size_t hash {ekg_ui_slider_range.value.get_type_info_hash()}; \
60+
ekg_ui_slider_range_task_impl(ekg_ui_slider_range, ekg::ui::f64, double, todo); \
61+
ekg_ui_slider_range_task_impl(ekg_ui_slider_range, ekg::ui::f32, float, todo); \
62+
ekg_ui_slider_range_task_impl(ekg_ui_slider_range, ekg::ui::i64, int64_t, todo); \
63+
ekg_ui_slider_range_task_impl(ekg_ui_slider_range, ekg::ui::u64, uint64_t, todo); \
64+
ekg_ui_slider_range_task_impl(ekg_ui_slider_range, ekg::ui::i32, int32_t, todo); \
65+
ekg_ui_slider_range_task_impl(ekg_ui_slider_range, ekg::ui::u32, uint32_t, todo); \
66+
ekg_ui_slider_range_task_impl(ekg_ui_slider_range, ekg::ui::i16, int16_t, todo); \
67+
ekg_ui_slider_range_task_impl(ekg_ui_slider_range, ekg::ui::u16, uint16_t, todo); \
68+
ekg_ui_slider_range_task_impl(ekg_ui_slider_range, ekg::ui::i8, int8_t, todo); \
69+
ekg_ui_slider_range_task_impl(ekg_ui_slider_range, ekg::ui::u8, uint8_t, todo);
70+
3171
namespace ekg::ui {
3272
void reload(
3373
ekg::property_t &property,

src/core/runtime.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ void ekg::core::reload(ekg::info_t &info) {
127127
continue;
128128
}
129129

130-
ekg_core_abstract_todo(
130+
ekg_core_widget_call(
131131
property.descriptor_at.flags,
132132
property.descriptor_at,
133133
ekg::ui::reload(property, descriptor);
@@ -216,7 +216,7 @@ void ekg::core::scalenize(ekg::info_t &info) {
216216
continue;
217217
}
218218

219-
ekg_core_abstract_todo(
219+
ekg_core_widget_call(
220220
property.descriptor_at.flags,
221221
property.descriptor_at,
222222

@@ -256,7 +256,7 @@ void ekg::core::poll_event() {
256256
(abs_widget.states.is_absolute || is_on_scrolling_timeout)
257257
) {
258258

259-
ekg_core_abstract_todo(
259+
ekg_core_widget_call(
260260
abs_widget.descriptor_at.flags,
261261
abs_widget.descriptor_at,
262262

@@ -296,7 +296,7 @@ void ekg::core::poll_event() {
296296
continue;
297297
}
298298

299-
ekg_core_abstract_todo(
299+
ekg_core_widget_call(
300300
property.descriptor_at.flags,
301301
property.descriptor_at,
302302

@@ -349,7 +349,7 @@ void ekg::core::poll_event() {
349349
};
350350

351351
if (focused_property != ekg::property_t::not_found) {
352-
ekg_core_abstract_todo(
352+
ekg_core_widget_call(
353353
focused_at.flags,
354354
focused_at,
355355

src/ekg.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ void ekg::update() {
102102
ekg::query<ekg::property_t>(ekg::p_core->high_frequency.at(it))
103103
};
104104

105-
ekg_core_abstract_todo(
105+
ekg_core_widget_call(
106106
property.descriptor_at.flags,
107107
property.descriptor_at,
108108
ekg::ui::high_frequency(property, descriptor);
@@ -147,7 +147,7 @@ void ekg::render() {
147147
continue;
148148
}
149149

150-
ekg_core_abstract_todo(
150+
ekg_core_widget_call(
151151
property.descriptor_at.flags,
152152
property.descriptor_at,
153153

src/io/memory.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ void ekg::unmap(void *pv_address) {
6666
ekg::mapped_address_sign_info_t &info {ekg::sign.list.at(it)};
6767
if (info.pv_address == pv_address) {
6868
for (ekg::at_t &at : info.ats) {
69-
ekg_core_abstract_todo(
69+
ekg_core_widget_call(
7070
at.flags,
7171
at,
7272
ekg::ui::unmap(descriptor);

src/layout/docknize.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -275,7 +275,7 @@ void ekg::layout::docknize_widget(
275275
}
276276

277277
if (parent_property.widget.should_refresh_size) {
278-
ekg_core_abstract_todo(
278+
ekg_core_widget_call(
279279
parent_property.descriptor_at.flags,
280280
parent_property.descriptor_at,
281281
ekg::ui::reload(parent_property, descriptor);
@@ -401,7 +401,7 @@ void ekg::layout::docknize_widget(
401401
property.widget.should_refresh_size = true;
402402
}
403403

404-
ekg_core_abstract_todo(
404+
ekg_core_widget_call(
405405
property.descriptor_at.flags,
406406
property.descriptor_at,
407407
ekg::ui::reload(property, descriptor);
@@ -570,7 +570,7 @@ void ekg::layout::docknize_widget(
570570
}
571571

572572
max_previous_height = rect.h > max_previous_height ? rect.h : max_previous_height;
573-
ekg_core_abstract_todo(
573+
ekg_core_widget_call(
574574
property.descriptor_at.flags,
575575
property.descriptor_at,
576576

@@ -619,7 +619,7 @@ float ekg::layout::get_widget_height_by_children(
619619
continue;
620620
}
621621

622-
ekg_core_abstract_todo(
622+
ekg_core_widget_call(
623623
property.descriptor_at.flags,
624624
property.descriptor_at,
625625
flags = descriptor.dock;

src/layout/extentnize.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ void ekg::layout::extentnize_widget(
184184
is_scrollbar = property.descriptor_at.flags == ekg::type::scrollbar;
185185
is_last_index = it == latest_index;
186186

187-
ekg_core_abstract_todo(
187+
ekg_core_widget_call(
188188
property.descriptor_at.flags,
189189
property.descriptor_at,
190190
dock = descriptor.dock;

src/ui/abstract.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@ ekg::rect_t<float> &ekg::ui::get_abs_rect(
4141
);
4242
}
4343

44-
4544
void ekg::ui::pre_event(
4645
ekg::property_t &property,
4746
ekg::rect_t<float> &descriptor_rect,

0 commit comments

Comments
 (0)