mirror of
https://github.com/Jaxan/hybrid-ads.git
synced 2025-04-27 23:17:44 +02:00
Adds phantom type (to be used for state/input/output)
This commit is contained in:
parent
864d0818d1
commit
b62d3a1a17
2 changed files with 74 additions and 0 deletions
44
lib/phantom.hpp
Normal file
44
lib/phantom.hpp
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <boost/operators.hpp>
|
||||||
|
#include <iosfwd>
|
||||||
|
|
||||||
|
template <typename Base, typename T>
|
||||||
|
struct phantom : boost::operators<phantom<Base, T>>, boost::shiftable<phantom<Base, T>> {
|
||||||
|
phantom(Base y) : x(y) {}
|
||||||
|
explicit operator Base() const { return x; }
|
||||||
|
Base base() const { return x; }
|
||||||
|
|
||||||
|
Base x;
|
||||||
|
|
||||||
|
#define IMPL(op) \
|
||||||
|
phantom & operator op (phantom rh) { \
|
||||||
|
x op rh.x; \
|
||||||
|
return *this; \
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPL(+=)
|
||||||
|
IMPL(-=)
|
||||||
|
IMPL(*=)
|
||||||
|
IMPL(/=)
|
||||||
|
IMPL(%=)
|
||||||
|
IMPL(|=)
|
||||||
|
IMPL(&=)
|
||||||
|
IMPL(^=)
|
||||||
|
IMPL(<<=)
|
||||||
|
IMPL(>>=)
|
||||||
|
#undef IMPL
|
||||||
|
|
||||||
|
phantom & operator++() { ++x; return *this; }
|
||||||
|
phantom & operator--() { --x; return *this; }
|
||||||
|
|
||||||
|
bool operator<(phantom rh) const { return x < rh.x; }
|
||||||
|
bool operator==(phantom rh) const { return x == rh.x; }
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename B, typename T>
|
||||||
|
std::ostream & operator<<(std::ostream & out, phantom<B, T> p){ return out << p.x; }
|
||||||
|
|
||||||
|
template <typename B, typename T>
|
||||||
|
std::istream & operator>>(std::istream & in, phantom<B, T> & p){ return in >> p.x; }
|
||||||
|
|
30
src/phantom_test.cpp
Normal file
30
src/phantom_test.cpp
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
#include <phantom.hpp>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
using phantom_int = phantom<int, T>;
|
||||||
|
|
||||||
|
struct state_tag;
|
||||||
|
using state = phantom_int<state_tag>;
|
||||||
|
|
||||||
|
struct input_tag;
|
||||||
|
using input = phantom_int<input_tag>;
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]){
|
||||||
|
state x = 5;
|
||||||
|
x += 5;
|
||||||
|
|
||||||
|
input y = 9;
|
||||||
|
y -= 9;
|
||||||
|
y++;
|
||||||
|
|
||||||
|
std::cout << (x - 1) << std::endl;
|
||||||
|
std::cout << (y << 1) << std::endl;
|
||||||
|
// std::cout << x+y << std::endl; // does not compile
|
||||||
|
|
||||||
|
for(input i = 0; i < 10; ++i){
|
||||||
|
std::cout << i << ", ";
|
||||||
|
}
|
||||||
|
std::cout << std::endl;
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue