Tool Libs
UMIT-TIROL Institute of Automation and Control Engineering library collection
 
Loading...
Searching...
No Matches
later.h
Go to the documentation of this file.
1
5#pragma once
6#include <utility>
7
21template<typename T>
22struct Later {
23 T& where{};
24 Later *nested{};
25 enum Op {NOP, ADD, SUB} op{};
26 ~Later() { delete nested; nested = nullptr; op = NOP; }
27 Later(T& val): where(val) {} // unable to store temporaries. cast the first operand to this type first
28 Later(T& v, Later *n, Op op): where(v), nested(n), op(op) {}
29 // copying impossible. who'd own nested Laters?
30 Later(const Later &)=delete;
31 Later& operator=(const Later &)=delete;
32 // moving is ok
33 Later(Later &&l) noexcept : where(l.where), nested(l.nested), op(l.op) {
34 l.nested = nullptr;
35 l.op = NOP;
36 }
37 Later& operator=(Later &&l) noexcept {
38 if (this == &l) return *this;
39 new (this) Later(std::move(l));
40 return *this;
41 }
42 Later operator+(T &val) {
43 return {
44 val,
45 ::new Later{std::move(*this)},
46 ADD,
47 };
48 }
49 Later operator-(T &val) {
50 return {
51 val,
52 ::new Later{std::move(*this)},
53 SUB,
54 };
55 }
57 T get() const {
58 switch (op) {
59 case ADD: return nested->get() + where;
60 case SUB: return nested->get() - where;
61 default: return where;
62 }
63 }
64 // placement new for copying into place
65 void *operator new(size_t sz, Later *where) {
66 where->~Later();
67 return where;
68 }
69};
Defer Additions & Subtractions until access.
Definition later.h:22
T get() const
get value
Definition later.h:57