NewLang Project
Yet another programm language
Loading...
Searching...
No Matches
variable.cpp
Go to the documentation of this file.
1#include "runtime.h"
2#include "variable.h"
3
4using namespace newlang;
5
6/*
7 *
8 *
9 */
10std::string newlang::utf8_encode(const std::wstring wstr) {
11 std::string utf8line;
12
13 if (wstr.empty()) {
14 return utf8line;
15 }
16 utf8line = std::wstring_convert < std::codecvt_utf8<wchar_t>>().to_bytes(wstr.c_str());
17 return utf8line;
18}
19
20// Convert an UTF8 string to a wide Unicode String
21
22std::wstring newlang::utf8_decode(const std::string str) {
23 std::wstring wide_line;
24
25 if (str.empty()) {
26 return wide_line;
27 }
28 wide_line = std::wstring_convert < std::codecvt_utf8<wchar_t>>().from_bytes(str.c_str());
29 return wide_line;
30}
31
32/*
33 *
34 *
35 */
36
37std::shared_ptr<Sync> Sync::CreateSync(const TermPtr &term) {
38 if (term && term->m_ref) {
39 return CreateSync(term->m_ref->m_text);
40 }
41 return std::shared_ptr<Sync>(nullptr);
42}
43
44std::shared_ptr<Sync> Sync::CreateSync(const std::string_view ref) {
45 if (!ref.empty()) {
46 RefType ref_type = RefTypeFromString(ref);
47 if (!(ref_type == RefType::Value || ref_type == RefType::Shared || ref_type == RefType::SharedConst)) {
48 return std::make_shared<Sync>(ref_type);
49 }
50 }
51 return std::shared_ptr<Sync>(nullptr);
52}
53
54VariableTaken::VariableTaken(const Variable &var, bool edit_mode,
55 const std::chrono::milliseconds & timeout_duration,
56 const std::string_view msg, const std::source_location & loc)
57: std::runtime_error(msg.begin()), variable(const_cast<Variable *> (&var)) {
58
59 if (std::holds_alternative<VariableShared> (var) && std::get<VariableShared>(var).sync) {
60 std::get<VariableShared>(var).sync->m_data = std::get<VariableShared>(var).data;
61 variable = std::get<VariableShared>(var).sync;
62 // sync = const_cast<std::shared_ptr<Sync> *>(&std::get<VariableShared>(var).sync);
63 } else if (std::holds_alternative<VariableWeak>(var) && std::get<VariableWeak>(var).sync) {
64 variable = std::get<VariableWeak>(var).sync;
65 // sync = const_cast<std::shared_ptr<Sync> *>(&std::get<VariableWeak>(var).sync);
66 } else if (std::holds_alternative<VariableTaken> (var)) {
67 variable = std::get<VariableTaken>(var).variable;
68 // sync = std::get<VariableGuard>(var).sync;
69 }
70
71 if (std::holds_alternative<std::shared_ptr < Sync >> (variable) && !std::get<std::shared_ptr < Sync >> (variable)->SyncLock(edit_mode, timeout_duration)) {
72 // Redefine string message in std::runtime_error
73 static_cast<std::runtime_error&> (*this) = std::runtime_error(
74 MakeTimeoutMessage(var, edit_mode, timeout_duration, msg, loc));
75
76 // Throw self
77 throw *this;
78 }
79 if (std::holds_alternative<VariableWeak> (var)) {
80 std::get<std::shared_ptr < Sync >> (variable)->m_data = std::get<VariableWeak>(var).weak.lock();
81 if (!std::get<std::shared_ptr < Sync >> (variable)->m_data) {
82 throw std::bad_weak_ptr();
83 }
84 // std::bad_weak_ptr is the type of the object thrown as exceptions by the constructors of std::shared_ptr
85 // that take std::weak_ptr as the argument, when the std::weak_ptr refers to an already deleted object.
86 }
87}
88
90 if (std::holds_alternative<std::shared_ptr < Sync >> (variable)) {
91 std::get<std::shared_ptr < Sync >> (variable)->SyncUnLock();
92 }
93}
94
95std::string VariableTaken::MakeTimeoutMessage(const Variable & var, bool edit_mode,
96 const std::chrono::milliseconds & timeout_duration,
97 const std::string_view message, const std::source_location & location) {
98
99 std::string result(message.begin());
100
101 if (message.empty()) {
102 result += "VariableGuard error for ";
103 result += edit_mode ? "write " : "read ";
104 result += " or timeout ";
105 result += std::to_string(timeout_duration.count());
106 result += " milliseconds at: ";
107
108 result += location.file_name();
109 result += "(";
110 result += std::to_string(location.line());
111 result += ":";
112 result += std::to_string(location.column());
113 result += ") `";
114 result += location.function_name();
115 result += "` ";
116
117 result += var.toString();
118 result += "\n";
119 }
120
121 result += "Stack trace:\n";
122 int counter = 0;
123 for (const auto& entry : std::stacktrace()) {
124 result += std::to_string(counter);
125 if (entry) {
126 result += "# ";
127 if (entry.description().empty()) {
128 result += " ";
129 } else {
130 result += entry.description();
131 }
132 result += " at ";
133 if (entry.source_file().empty()) {
134 result += " ";
135 } else {
136 result += entry.source_file();
137 }
138 result += " :";
139 result += std::to_string(entry.source_line());
140 }
141 }
142 return result;
143}
144
145
146/*
147 *
148 *
149 */
150//std::unique_ptr<Sync> Variable::MakeSync(const std::string_view ref) {
151// if (ref.empty() || ref[0] == '*') {
152// return nullptr;
153// }
154// RefType ref_type = RefTypeFromString(ref);
155// ASSERT(ref_type != RefType::Value);
156// return std::make_unique<Sync>(ref_type);
157//}
158//
159//std::unique_ptr<Sync> Variable::MakeSync(const TermPtr &term) {
160// if (!isShared(term)) {
161// return nullptr;
162// }
163// return MakeSync(term->m_ref->m_text);
164//}
165
166bool Variable::isShared(const TermPtr &term) {
167 return term && term->m_ref && !term->m_ref->m_text.empty();
168}
169
170
171
172
173
174#pragma clang diagnostic push
175#pragma clang diagnostic error "-Wswitch"
176
178 return Variable::Object(pair ? &pair->var : nullptr);
179}
180
182 if (!variable || std::holds_alternative<std::monostate>(*variable)) {
183 LOG_RUNTIME("Object not initialized (%s)!", variable ? "monostate" : "nullptr");
184 } else if (std::holds_alternative<int64_t>(*variable)) {
185 return Obj::CreateValue(std::get<int64_t>(*variable));
186 } else if (std::holds_alternative<double>(*variable)) {
187 return Obj::CreateValue(std::get<double>(*variable));
188 } else if (std::holds_alternative<std::string>(*variable)) {
189 return Obj::CreateString(std::get<std::string>(*variable));
190 } else if (std::holds_alternative<std::wstring>(*variable)) {
191 return Obj::CreateString(std::get<std::wstring>(*variable));
192 } else if (std::holds_alternative<Rational>(*variable)) {
193 return Obj::CreateRational(std::get<Rational>(*variable));
194 } else if (std::holds_alternative<ObjPtr>(*variable)) {
195 return std::get<ObjPtr>(*variable);
196 }
197 LOG_RUNTIME("Fail create Object or incompatible data type index '%zu' (%s)!", variable->index(), VariableCaseToString(variable->index()));
198}
199
200Variable Variable::Ref(const std::string_view ref) const {
201// if (!is_taked()) {
202// LOG_RUNTIME("Variable not taked!");
203// }
204// switch (static_cast<VariableCase> (this->index())) {
205// case VariableCase::INTEGER:
206// case VariableCase::DOUBLE:
207// return GetValueAsInteger();
208// case VariableCase::RATIONAL:
209// return !std::get<Rational>(*this).GetAsBoolean();
210//
211// case VariableCase::SHARED:
212// return std::get<VariableShared> (*this).data->GetValueAsBoolean();
213//
214// case VariableCase::TAKEN:
215// return (*std::get<VariableTaken> (*this)).GetValueAsBoolean();
216//
217// case VariableCase::OBJECT:
218// return std::get<ObjPtr>(*this)->GetValueAsInteger();
219// // case VariableCase::POINTER:
220// // return std::get<void *>(*this);
221//
222// case VariableCase::STRING:
223// return !std::get<std::string>(*this).empty();
224// case VariableCase::WSTRING:
225// return !std::get<std::wstring>(*this).empty();
226//
227// case VariableCase::EMPTY:
228// case VariableCase::WEAK:
229// }
230 LOG_RUNTIME("Data type '%s' %d incompatible to boolean type!", VariableCaseToString(this->index()), static_cast<int> (this->index()));
231
232
233 // if (owner) {
234 // return VarData(std::weak_ptr<VarData>(owner));
235 // } else if (std::holds_alternative<std::shared_ptr < VarData >> (data)) {
236 // return VarData(std::weak_ptr<VarData>(std::get<std::shared_ptr < VarData >> (data)));
237 // } else if (std::holds_alternative<std::weak_ptr < VarData >> (data)) {
238 // return VarData(std::get<std::weak_ptr < VarData >> (data));
239 // } else if (is_taked()) {
240 // return std::get<std::unique_ptr < VarGuard >> (data)->m_var->Ref();
241 // } else {
242 // LOG_RUNTIME("Fail logic Ref()!");
243 // }
244}
245
246//VariableGuard Variable::MakeTake(bool edit_mode, const std::chrono::milliseconds & timeout_duration) const {
247// if (sync) {
248// return VariableGuard(*this, edit_mode, timeout_duration);
249// } else if (std::holds_alternative<VariableGuard> (*this)) {
250// return std::get<VariableGuard> (*this);
251// } else if (std::holds_alternative<std::shared_ptr < Variable >> (*this)) {
252// return VariableGuard(std::get<std::shared_ptr < Variable >> (*this).get(), edit_mode, timeout_duration);
253// } else if (std::holds_alternative<std::weak_ptr < Variable >> (*this)) {
254// return VariableGuard(std::get<std::weak_ptr < Variable >> (*this).lock().get(), edit_mode, timeout_duration);
255// } else {
256// LOG_RUNTIME("Fail logic Take()!");
257// }
258//}
259
260/*
261 *
262 *
263 */
264
266 if (!is_taked()) {
267 LOG_RUNTIME("Variable not taked!");
268 }
269 switch (static_cast<VariableCase> (this->index())) {
272 return GetValueAsInteger();
274 return !std::get<Rational>(*this).GetAsBoolean();
275
277 return std::get<VariableShared> (*this).data->GetValueAsBoolean();
278
280 return (*std::get<VariableTaken> (*this)).GetValueAsBoolean();
281
283 return std::get<ObjPtr>(*this)->GetValueAsInteger();
284 // case VariableCase::POINTER:
285 // return std::get<void *>(*this);
286
288 return !std::get<std::string>(*this).empty();
290 return !std::get<std::wstring>(*this).empty();
291
294 }
295 LOG_RUNTIME("Data type '%s' %d incompatible to boolean type!", VariableCaseToString(this->index()), static_cast<int> (this->index()));
296}
297
299 if (!is_taked()) {
300 LOG_RUNTIME("Variable not taked!");
301 }
302 switch (static_cast<VariableCase> (this->index())) {
304 return std::get<int64_t>(*this);
306 return std::get<ObjPtr>(*this)->GetValueAsInteger();
308 return std::get<VariableShared> (*this).data->GetValueAsInteger();
310 return (*std::get<VariableTaken> (*this)).GetValueAsInteger();
311
312
315
318 // case VariableCase::POINTER:
321 }
322 LOG_RUNTIME("Data type '%s' %d incompatible to integer type!", VariableCaseToString(this->index()), static_cast<int> (this->index()));
323}
324
326 if (!is_taked()) {
327 LOG_RUNTIME("Variable not taked!");
328 }
329
330 switch (static_cast<VariableCase> (this->index())) {
332 return std::get<double>(*this);
333
335 return std::get<int64_t>(*this);
336
338 return std::get<ObjPtr>(*this)->GetValueAsNumber();
339
341 return std::get<Rational>(*this).GetAsNumber();
342
344 return std::get<VariableShared> (*this).data->GetValueAsNumber();
345
347 return (*std::get<VariableTaken> (*this)).GetValueAsNumber();
348
349
352
353 // case VariableCase::POINTER:
356 }
357 LOG_RUNTIME("Data type '%s' %d incompatible to number type!", VariableCaseToString(this->index()), static_cast<int> (this->index()));
358}
359
361
362 if (!is_taked()) {
363 LOG_RUNTIME("Variable not taked!");
364 }
365
366 switch (static_cast<VariableCase> (this->index())) {
368 return std::get<std::string>(*this);
369
371 // return std::get<ObjPtr>(*this)->GetValueAsString();
372
374 // return std::get<std::shared_ptr<Variable>>(*this)->GetValueAsString();
376 // return std::get<std::shared_ptr < VariableGuard >> (*this)->m_var->GetValueAsString();
377
381 // case VariableCase::POINTER:
383
386 }
387 LOG_RUNTIME("Data type '%s' %d incompatible to string!", VariableCaseToString(this->index()), static_cast<int> (this->index()));
388}
389
391
392 if (!is_taked()) {
393 LOG_RUNTIME("Variable not taked!");
394 }
395
396 switch (static_cast<VariableCase> (this->index())) {
398 return std::get<std::wstring>(*this);
399
401 // return std::get<ObjPtr>(*this)->GetValueAsStringWide();
402
404 // return std::get<std::shared_ptr<Variable>>(*this)->GetValueAsStringWide();
405
407 // return std::get<std::shared_ptr < VariableGuard >> (*this)->m_var->GetValueAsStringWide();
408
412 // case VariableCase::POINTER:
414
417 }
418 LOG_RUNTIME("Data type '%s' %d incompatible to wstring!", VariableCaseToString(this->index()), static_cast<int> (this->index()));
419}
420
422 if (!is_taked()) {
423 LOG_RUNTIME("Variable not taked!");
424 }
425
426 switch (static_cast<VariableCase> (this->index())) {
427 // case VariableCase::DOUBLE:
428 // return std::get<double>(*this);
429 //
430 // case VariableCase::INTEGER:
431 // return std::get<int64_t>(*this);
432
434 return *std::get<ObjPtr>(*this)->GetValueAsRational();
435
437 return std::get<Rational>(*this);
438
440 return std::get<VariableShared> (*this).data->GetValueAsRational();
441
443 return (*std::get<VariableTaken> (*this)).GetValueAsRational();
444
447
450
451 // case VariableCase::POINTER:
454 }
455 LOG_RUNTIME("Data type '%s' %d incompatible to number type!", VariableCaseToString(this->index()), static_cast<int> (this->index()));
456}
457
459 if (!is_taked()) {
460 LOG_RUNTIME("Variable not taked!");
461 }
462
463 switch (static_cast<VariableCase> (this->index())) {
464 // case VariableCase::DOUBLE:
465 // return std::get<double>(*this);
466 //
467 // case VariableCase::INTEGER:
468 // return std::get<int64_t>(*this);
469
471 return std::get<ObjPtr>(*this);
472
473 // case VariableCase::RATIONAL:
474 // return std::get<Rational>(*this);
475
477 return std::get<VariableShared> (*this).data->GetValueAsObject();
478
480 return (*std::get<VariableTaken> (*this)).GetValueAsObject();
481
483 return Obj::CreateRational(std::get<Rational>(*this));
484
486 return Obj::CreateValue(std::get<double>(*this));
487
489 return Obj::CreateValue(std::get<int64_t>(*this));
490
492 return Obj::CreateNone();
493
495 return Obj::CreateString(std::get<std::string>(*this));
496
498 return Obj::CreateString(std::get<std::wstring>(*this));
499
501
502 // case VariableCase::POINTER:
503 }
504 LOG_RUNTIME("Data type '%s' %d incompatible to number type!", VariableCaseToString(this->index()), static_cast<int> (this->index()));
505}
506
508 if (!is_taked()) {
509 LOG_RUNTIME("Variable not taked!");
510 }
511
512 switch (static_cast<VariableCase> (this->index())) {
513 // case VariableCase::POINTER:
514 // return std::get<void *>(*this);
515
517 return std::get<VariableShared> (*this).data->GetValueAsPointer();
518
520 return (*std::get<VariableTaken> (*this)).GetValueAsPointer();
521
523 // return std::get<double>(*this);
524
526 // return std::get<int64_t>(*this);
527
529 // return std::get<ObjPtr>(*this)->GetValueAsNumber();
530
532 // return std::get<Rational>(*this).GetAsNumber();
533
536
539 }
540 LOG_RUNTIME("Data type '%s' %d incompatible to number type!", VariableCaseToString(this->index()), static_cast<int> (this->index()));
541}
542
543std::string Variable::toString() const {
544
545 std::string result(is_taked() ? "" : " Not taked!");
546
547 switch (static_cast<VariableCase> (this->index())) {
549 result.insert(0, "Empty");
550 break;
551
552 // case VariableCase::POINTER:
553 // {
554 // result.insert(0, std::to_string(reinterpret_cast<uintptr_t> (std::get<void *>(*this))));
555 // // std::stringstream ss;
556 // // ss << std::get<void *>(*this);
557 // // result.insert(0, ss.str());
558 // break;
559 // }
560
562 result.insert(0, std::get<VariableShared> (*this).data->toString());
563 result.insert(0, "Shared: ");
564 break;
565
567 result.insert(0, (*std::get<VariableTaken> (*this)).toString());
568 result.insert(0, "Guard: ");
569 break;
570
572 result.insert(0, std::to_string(std::get<double>(*this)));
573 break;
574
576 result.insert(0, std::to_string(std::get<int64_t>(*this)));
577 break;
578
580 result.insert(0, std::get<ObjPtr> (*this)->toString());
581 result.insert(0, "Object: ");
582 break;
583
585 result.insert(0, std::get<Rational> (*this).GetAsString());
586 break;
587
589 result.insert(0, "\"");
590 result.insert(0, std::get<std::string> (*this));
591 result.insert(0, "\"");
592 break;
593
595 result.insert(0, "'");
596 result.insert(0, std::get<std::string> (*this));
597 result.insert(0, "'");
598 break;
599
601 result.insert(0, "link to:");
602 break;
603
604 }
605 return result;
606}
607
608
611
614
615
622
623/*
624 *
625 *
626 */
627
629 // Variable result(this->Copy());
630
631 if (!var.is_taked()) {
632 LOG_RUNTIME("Variable not taked!");
633 }
634
635 switch (static_cast<VariableCase> (var.index())) {
637 return Variable(std::get<ObjPtr>(var)->Copy());
638
642 // case VariableCase::POINTER:
645 return Variable(var);
646
648 // return std::get<std::shared_ptr < Variable >> (self)->GetValueAsPointer();
649
651 // return std::get<std::shared_ptr < VariableGuard >> (*this)->m_var->GetValueAsPointer();
652
655 }
656
657 LOG_RUNTIME("Data type '%s' %d copy not implemented!", VariableCaseToString(var.index()), static_cast<int> (var.index()));
658}
659
661 // Variable result(this->Copy());
662
663 if (!var.is_taked()) {
664 LOG_RUNTIME("Variable not taked!");
665 }
666
667 switch (static_cast<VariableCase> (var.index())) {
669 return Variable(std::get<ObjPtr>(var)->Clone());
670
674 // case VariableCase::POINTER:
677 return Variable(var);
678
680 // return std::get<std::shared_ptr < Variable >> (self)->GetValueAsPointer();
681
683 // return std::get<std::shared_ptr < VariableGuard >> (*this)->m_var->GetValueAsPointer();
684
687 }
688
689 LOG_RUNTIME("Data type '%s' %d copy not implemented!", VariableCaseToString(var.index()), static_cast<int> (var.index()));
690}
691
692/*
693 *
694 */
696 switch (static_cast<VariableCase> (index())) {
698 return true;
699 default:
700 }
701 return false;
702}
703
705 switch (static_cast<VariableCase> (index())) {
709 return true;
711 return std::get<ObjPtr>(*this)->is_scalar();
712 default:
713 }
714 return false;
715}
716
718 switch (static_cast<VariableCase> (index())) {
720 return true;
722 return std::get<ObjPtr>(*this)->is_floating();
723 default:
724 }
725 return false;
726}
727
729 switch (static_cast<VariableCase> (index())) {
730 // case VariableCase::INTEGER:
731 // case VariableCase::DOUBLE:
732 // case VariableCase::RATIONAL:
733 // return true;
735 return std::get<ObjPtr>(*this)->is_complex();
736 default:
737 }
738 return false;
739}
740
742 switch (static_cast<VariableCase> (index())) {
744 return true;
746 return std::get<ObjPtr>(*this)->is_rational();
747 default:
748 }
749 return false;
750}
751
753 switch (static_cast<VariableCase> (index())) {
756 return true;
758 return std::get<ObjPtr>(*this)->is_string_type();
759 default:
760 }
761 return false;
762}
763
764/*
765 *
766 */
767
768int VariableOp::__eq__(const Variable &self, const Variable &other) {
769 if (&self == &other) {
770 return 0;
771 }
772 if (self.is_scalar_type() && other.is_scalar_type()) {
773 if (self.is_floating_type() || other.is_floating_type()) {
774 if (self.GetValueAsNumber() < other.GetValueAsNumber()) {
775 return -1;
776 } else if (self.GetValueAsNumber() > other.GetValueAsNumber()) {
777 return 1;
778 };
779 return 0;
780 } else if (self.is_complex_type() || other.is_complex_type()) {
781 // Будет ошибка сравнения комплексных значений
782 } else {
783 if (self.GetValueAsInteger() < other.GetValueAsInteger()) {
784 return -1;
785 } else if (self.GetValueAsInteger() > other.GetValueAsInteger()) {
786 return 1;
787 };
788 return 0;
789 }
790 } else if (self.is_rational_type() && other.is_scalar_type()) {
791 return self.GetValueAsRational().op_compare(other.GetValueAsRational());
792 } else if ((self.is_string_type() && other.is_string_type())) {
793 return const_cast<Variable &> (self).GetValueAsString().compare(const_cast<Variable &> (other).GetValueAsString());
794 }
795 LOG_RUNTIME("Fail compare type %s and %s", VariableCaseToString(self.index()), VariableCaseToString(other.index()));
796}
797
798bool VariableOp::__strict_eq__(const Variable &self, const Variable &other) {
799 return VariableOp::__eq__(self, other) == 0; // temporary
800}
801
802
803/*
804 *
805 *
806 *
807 */
808
809
810
811
812#define DEFINE_OPERATOR_IMPL(name) __attribute__ ((weak)) Variable & VariableOp::__ ## name ## __(Variable &self, const Variable &other)
813
814DEFINE_OPERATOR_IMPL(iadd_only_numbers) {
815
816 if (!self.is_taked()) {
817 LOG_RUNTIME("Variable not taked!");
818 }
819
820 switch (static_cast<VariableCase> (self.index())) {
822 std::get<double>(self) += other.GetValueAsNumber();
823 return self;
824
826 std::get<int64_t>(self) += other.GetValueAsInteger();
827 return self;
828
830 *std::get<ObjPtr>(self) += other.GetValueAsObject();
831 return self;
832
834 std::get<Rational>(self) += other.GetValueAsRational();
835 return self;
836
837 // case VariableCase::POINTER:
838 // return std::get<void *>(self);
839
841 // return std::get<std::shared_ptr < Variable >> (self)->GetValueAsPointer();
842
844 // return std::get<std::shared_ptr < VariableGuard >> (*this)->m_var->GetValueAsPointer();
845
848
851 }
852 LOG_RUNTIME("Data type '%s' %d incompatible to number type!", VariableCaseToString(self.index()), static_cast<int> (self.index()));
853}
854
856 switch (static_cast<VariableCase> (self.index())) {
858 std::get<std::string>(self) += const_cast<Variable&> (other).GetValueAsString();
859 return self;
860
862 std::get<std::wstring>(self) += const_cast<Variable&> (other).GetValueAsStringWide();
863 return self;
864 default:
865 }
866
868 return (*VariableOp::iadd.parent(&VariableOp::__iadd__))(self, other);
869}
870
871/*
872 *
873 */
874
876
877 if (!self.is_taked()) {
878 LOG_RUNTIME("Variable not taked!");
879 }
880
881 switch (static_cast<VariableCase> (self.index())) {
883 std::get<double>(self) -= other.GetValueAsNumber();
884 return self;
885
887 std::get<int64_t>(self) -= other.GetValueAsInteger();
888 return self;
889
891 *std::get<ObjPtr>(self) -= other.GetValueAsObject();
892 return self;
893
895 std::get<Rational>(self) -= other.GetValueAsRational();
896 return self;
897
898 // case VariableCase::POINTER:
899 // return std::get<void *>(self);
900
902 // return std::get<std::shared_ptr < Variable >> (self)->GetValueAsPointer();
903
905 // return std::get<std::shared_ptr < VariableGuard >> (*this)->m_var->GetValueAsPointer();
906
909
912 }
913 LOG_RUNTIME("Data type '%s' %d incompatible to number type!", VariableCaseToString(self.index()), static_cast<int> (self.index()));
914}
915
916DEFINE_OPERATOR_IMPL(imul_only_numbers) {
917
918 if (!self.is_taked()) {
919 LOG_RUNTIME("Variable not taked!");
920 }
921
922 switch (static_cast<VariableCase> (self.index())) {
924 std::get<double>(self) *= other.GetValueAsNumber();
925 return self;
926
928 std::get<int64_t>(self) *= other.GetValueAsInteger();
929 return self;
930
932 *std::get<ObjPtr>(self) *= other.GetValueAsObject();
933 return self;
934
936 std::get<Rational>(self) *= other.GetValueAsRational();
937 return self;
938
939 // case VariableCase::POINTER:
940 // return std::get<void *>(self);
941
943 // return std::get<std::shared_ptr < Variable >> (self)->GetValueAsPointer();
944
946 // return std::get<std::shared_ptr < VariableGuard >> (*this)->m_var->GetValueAsPointer();
947
950
953 }
954 LOG_RUNTIME("Data type '%s' %d incompatible to number type!", VariableCaseToString(self.index()), static_cast<int> (self.index()));
955}
956
958 switch (static_cast<VariableCase> (self.index())) {
960 std::get<std::string>(self) = repeat(std::get<std::string>(self), other.GetValueAsInteger());
961 return self;
962
964 std::get<std::wstring>(self) = repeat(std::get<std::wstring>(self), other.GetValueAsInteger());
965 return self;
966 default:
967 }
969 return (*VariableOp::imul.parent(&VariableOp::__imul__))(self, other);
970}
971
972/*
973 *
974 */
975
976/*
977 * x / y __truediv__(self, other) x /= y __itruediv__(self, other)
978 */
979DEFINE_OPERATOR_IMPL(itruediv) {
980
981 if (!self.is_taked()) {
982 LOG_RUNTIME("Variable not taked!");
983 }
984
985 switch (static_cast<VariableCase> (self.index())) {
987 std::get<double>(self) /= other.GetValueAsNumber();
988 return self;
989
991 std::get<int64_t>(self) /= other.GetValueAsInteger();
992 return self;
993
995 *std::get<ObjPtr>(self) /= other.GetValueAsObject();
996 return self;
997
999 std::get<Rational>(self) /= other.GetValueAsRational();
1000 return self;
1001
1002 // case VariableCase::POINTER:
1003 // return std::get<void *>(self);
1004
1006 // return std::get<std::shared_ptr < Variable >> (self)->GetValueAsPointer();
1007
1009 // return std::get<std::shared_ptr < VariableGuard >> (*this)->m_var->GetValueAsPointer();
1010
1012 case VariableCase::WEAK:
1013
1015 // std::get<std::string>(self) += other.GetValueAsString();
1016 // return self;
1017
1019 // std::get<std::wstring>(self) += other.GetValueAsStringWide();
1020 // return self;
1021 }
1022 LOG_RUNTIME("Data type '%s' %d incompatible to number type!", VariableCaseToString(self.index()), static_cast<int> (self.index()));
1023}
1024
1025/*
1026 * x // y __floordiv__(self, other) x //= y __ifloordiv__(self, other)
1027 */
1028DEFINE_OPERATOR_IMPL(ifloordiv) {
1029
1030 if (!self.is_taked()) {
1031 LOG_RUNTIME("Variable not taked!");
1032 }
1033
1034 switch (static_cast<VariableCase> (self.index())) {
1036 std::get<double>(self) *= other.GetValueAsNumber();
1037 return self;
1038
1040 std::get<int64_t>(self) *= other.GetValueAsInteger();
1041 return self;
1042
1044 // op_div_ceil
1045 // *std::get<ObjPtr>(self) *= other.GetValueAsObject();
1046 // return self;
1047
1049 // std::get<Rational>(self) *= other.GetValueAsRational();
1050 // return self;
1051
1052 // case VariableCase::POINTER:
1053 // return std::get<void *>(self);
1054
1056 // return std::get<std::shared_ptr < Variable >> (self)->GetValueAsPointer();
1057
1059 // return std::get<std::shared_ptr < VariableGuard >> (*this)->m_var->GetValueAsPointer();
1060
1062 case VariableCase::WEAK:
1063
1065 // std::get<std::string>(self) += other.GetValueAsString();
1066 // return self;
1067
1069 // std::get<std::wstring>(self) += other.GetValueAsStringWide();
1070 // return self;
1071 }
1072 LOG_RUNTIME("Data type '%s' %d incompatible to number type!", VariableCaseToString(self.index()), static_cast<int> (self.index()));
1073}
1074
1075/*
1076 * x % y __mod__(self, other) x %= y __imod__(self, other)
1077 */
1079
1080 if (!self.is_taked()) {
1081 LOG_RUNTIME("Variable not taked!");
1082 }
1083
1084 switch (static_cast<VariableCase> (self.index())) {
1086 std::get<int64_t>(self) %= other.GetValueAsInteger();
1087 return self;
1088
1090 *std::get<ObjPtr>(self) %= other.GetValueAsObject();
1091 return self;
1092
1094 std::get<Rational>(self) %= other.GetValueAsRational();
1095 return self;
1096
1098 // std::get<double>(self) %= other.GetValueAsNumber();
1099 // return self;
1100
1101 // case VariableCase::POINTER:
1102 // return std::get<void *>(self);
1103
1105 // return std::get<std::shared_ptr < Variable >> (self)->GetValueAsPointer();
1106
1108 // return std::get<std::shared_ptr < VariableGuard >> (*this)->m_var->GetValueAsPointer();
1109
1111 case VariableCase::WEAK:
1112
1114 // std::get<std::string>(self) += other.GetValueAsString();
1115 // return self;
1116
1118 // std::get<std::wstring>(self) += other.GetValueAsStringWide();
1119 // return self;
1120 }
1121 LOG_RUNTIME("Data type '%s' %d incompatible to number type!", VariableCaseToString(self.index()), static_cast<int> (self.index()));
1122}
1123
1124#pragma clang diagnostic pop
static ObjPtr CreateString(const std::string_view str, Sync *sync=nullptr)
Definition object.h:1596
static std::enable_if< std::is_same< T, std::string >::value||std::is_same< T, constchar * >::value, ObjPtr >::type CreateValue(T value, Sync *sync=nullptr)
Definition object.h:1562
static ObjPtr CreateRational(const Rational &val)
Definition object.h:1437
static ObjPtr CreateNone(Sync *sync=nullptr)
Definition object.h:1510
int op_compare(const Rational &rational) const
Definition rational.cpp:406
static std::shared_ptr< Sync > CreateSync(const TermPtr &term)
Definition variable.cpp:37
static Variable & __imul_only_numbers__(Variable &self, const Variable &other)
static Variable & __itruediv__(Variable &self, const Variable &other)
static OperatorType ifloordiv
Definition variable.h:365
static VirtualFuncImpl< Variable, const Variable & > copy
Definition variable.h:336
static int __eq__(const Variable &self, const Variable &other)
Definition variable.cpp:768
static Variable __clone__(const Variable &clone)
Definition variable.cpp:660
static Variable & __imul__(Variable &self, const Variable &other)
static Variable & __isub__(Variable &self, const Variable &other)
static bool __strict_eq__(const Variable &self, const Variable &other)
Definition variable.cpp:798
static OperatorType itruediv
Definition variable.h:364
static Variable & __ifloordiv__(Variable &self, const Variable &other)
static VirtualFuncImpl< Variable, const Variable & > clone
Definition variable.h:339
static OperatorType iadd
Definition variable.h:361
static Variable & __iadd_only_numbers__(Variable &self, const Variable &other)
static Variable __copy__(const Variable &copy)
Definition variable.cpp:628
static OperatorType isub
Definition variable.h:362
static Variable & __imod__(Variable &self, const Variable &other)
static VirtualFuncImpl< bool, const Variable &, const Variable & > strict_eq
Definition variable.h:345
static OperatorType imul
Definition variable.h:363
static VirtualFuncImpl< int, const Variable &, const Variable & > eq
Definition variable.h:342
static Variable & __iadd__(Variable &self, const Variable &other)
static OperatorType imod
Definition variable.h:366
std::variant< Variable *, std::shared_ptr< Variable >, std::shared_ptr< Sync > > variable
Definition variable.h:224
static std::string MakeTimeoutMessage(const Variable &var, bool edit_mode, const std::chrono::milliseconds &timeout_duration, const std::string_view message, const std::source_location &location)
Definition variable.cpp:95
VariableTaken(const Variable &var, bool edit_mode, const std::chrono::milliseconds &timeout_duration=Sync::SyncTimeoutDeedlock, const std::string_view message="", const std::source_location &location=std::source_location::current())
Definition variable.cpp:54
bool is_floating_type() const
Definition variable.cpp:717
bool is_rational_type() const
Definition variable.cpp:741
int64_t GetValueAsInteger() const
Definition variable.cpp:298
double GetValueAsNumber() const
Definition variable.cpp:325
std::wstring & GetValueAsStringWide()
Definition variable.cpp:390
std::string & GetValueAsString()
Definition variable.cpp:360
bool is_object_type() const
Definition variable.cpp:695
bool GetValueAsBoolean() const
Definition variable.cpp:265
ObjPtr GetValueAsObject() const
Definition variable.cpp:458
void * GetValueAsPointer() const
Definition variable.cpp:507
static ObjPtr Object(Variable *variable)
Definition variable.cpp:181
bool is_complex_type() const
Definition variable.cpp:728
std::string toString() const
Definition variable.cpp:543
Rational GetValueAsRational() const
Definition variable.cpp:421
bool is_taked() const
Definition variable.h:595
bool is_scalar_type() const
Definition variable.cpp:704
int compare(const Variable &other) const
Definition variable.h:813
static bool isShared(const TermPtr &term)
Definition variable.cpp:166
bool is_string_type() const
Definition variable.cpp:752
Variable Ref(const std::string_view ref) const
Definition variable.cpp:200
int result
Definition lexer.l:367
#define LOG_RUNTIME(format,...)
Definition logger.h:26
#define ASSERT(condition)
Definition logger.h:60
Definition nlc.h:59
std::wstring utf8_decode(const std::string str)
Definition variable.cpp:22
std::shared_ptr< Term > TermPtr
Definition variable.h:33
std::shared_ptr< Obj > ObjPtr
Definition variable.h:28
const char * VariableCaseToString(size_t index)
Definition variable.h:425
constexpr RefType RefTypeFromString(const std::string_view text)
Definition variable.h:55
T repeat(T str, const std::size_t n)
Definition types.h:116
std::string utf8_encode(const std::wstring wstr)
Definition variable.cpp:10
#define DEFINE_OPERATOR_IMPL(name)
Definition variable.cpp:812