Subordination
A framework for distributed programming
kernel_proto_flag.hh
1 #ifndef SUBORDINATION_PPL_KERNEL_PROTO_FLAG_HH
2 #define SUBORDINATION_PPL_KERNEL_PROTO_FLAG_HH
3 
4 namespace sbn {
5 
7 
8  public:
9  typedef int flag_type;
10 
11  private:
12  flag_type _flag = 0;
13 
14  public:
15  enum flag_enum: flag_type {
16  prepend_source_and_destination = 1,
17  prepend_application = 2,
18  save_upstream_kernels = 4,
19  save_downstream_kernels = 8,
20  };
21 
22  kernel_proto_flag() = default;
23 
24  kernel_proto_flag(const kernel_proto_flag&) = default;
25 
26  inline
27  kernel_proto_flag(flag_type rhs) noexcept:
28  _flag(rhs)
29  {}
30 
31  inline
32  operator flag_type() const noexcept {
33  return this->_flag;
34  }
35 
36  inline kernel_proto_flag&
37  operator|=(kernel_proto_flag rhs) noexcept {
38  this->_flag |= flag_type(rhs);
39  return *this;
40  }
41 
42  inline kernel_proto_flag&
43  operator&=(kernel_proto_flag rhs) noexcept {
44  this->_flag &= flag_type(rhs);
45  return *this;
46  }
47 
48  };
49 
50  #define MAKE_UNARY(op) \
51  inline kernel_proto_flag \
52  operator op(kernel_proto_flag rhs) noexcept { \
53  return op kernel_proto_flag::flag_type(rhs); \
54  }
55 
56  #define MAKE_BINARY(op, return_type) \
57  inline return_type \
58  operator op(kernel_proto_flag lhs, kernel_proto_flag rhs) noexcept { \
59  return kernel_proto_flag::flag_type(lhs) op kernel_proto_flag::flag_type(rhs); \
60  } \
61  inline return_type \
62  operator op(kernel_proto_flag::flag_type lhs, kernel_proto_flag rhs) noexcept { \
63  return lhs op kernel_proto_flag::flag_type(rhs); \
64  } \
65  inline return_type \
66  operator op(kernel_proto_flag lhs, kernel_proto_flag::flag_type rhs) noexcept { \
67  return kernel_proto_flag::flag_type(lhs) op rhs; \
68  }
69 
70  MAKE_UNARY(~)
71  MAKE_BINARY(|, kernel_proto_flag)
72  MAKE_BINARY(&, kernel_proto_flag)
73  MAKE_BINARY(^, kernel_proto_flag)
74  MAKE_BINARY(==, bool)
75  MAKE_BINARY(!=, bool)
76 
77  #undef MAKE_UNARY
78  #undef MAKE_BINARY
79 
80 }
81 
82 #endif // vim:filetype=cpp
Definition: kernel_proto_flag.hh:6