Subordination
A framework for distributed programming
kernel_header_flag.hh
1 #ifndef SUBORDINATION_PPL_KERNEL_HEADER_FLAG_HH
2 #define SUBORDINATION_PPL_KERNEL_HEADER_FLAG_HH
3 
4 #include <cstdint>
5 
6 #include <unistdx/net/bstream>
7 
8 namespace sbn {
9 
11 
12  public:
13  typedef std::uint8_t flag_type;
14 
15  private:
16  flag_type _flag = 0;
17 
18  public:
19  enum flag_enum: flag_type {
20  has_source_and_destination = 1,
21  has_application = 2,
22  owns_application = 4,
23  has_source = 8,
24  has_destination = 16,
25  };
26 
27  kernel_header_flag() = default;
28 
29  kernel_header_flag(const kernel_header_flag&) = default;
30 
31  inline
32  kernel_header_flag(flag_type rhs) noexcept:
33  _flag(rhs)
34  {}
35 
36  inline
37  operator flag_type() const noexcept {
38  return this->_flag;
39  }
40 
41  inline kernel_header_flag&
42  operator|=(kernel_header_flag rhs) noexcept {
43  this->_flag |= flag_type(rhs);
44  return *this;
45  }
46 
47  inline kernel_header_flag&
48  operator&=(kernel_header_flag rhs) noexcept {
49  this->_flag &= flag_type(rhs);
50  return *this;
51  }
52 
53  friend sys::bstream&
54  operator<<(sys::bstream& out, const kernel_header_flag& rhs);
55 
56  friend sys::bstream&
57  operator>>(sys::bstream& in, kernel_header_flag& rhs);
58 
59  };
60 
61  inline sys::bstream&
62  operator<<(sys::bstream& out, const kernel_header_flag& rhs) {
63  return out << rhs._flag;
64  }
65 
66  inline sys::bstream&
67  operator>>(sys::bstream& in, kernel_header_flag& rhs) {
68  return in >> rhs._flag;
69  }
70 
71  #define MAKE_UNARY(op) \
72  inline kernel_header_flag \
73  operator op(kernel_header_flag rhs) noexcept { \
74  return op kernel_header_flag::flag_type(rhs); \
75  }
76 
77  #define MAKE_BINARY(op, return_type) \
78  inline return_type \
79  operator op(kernel_header_flag lhs, kernel_header_flag rhs) noexcept { \
80  return kernel_header_flag::flag_type(lhs) op kernel_header_flag::flag_type(rhs); \
81  } \
82  inline return_type \
83  operator op(kernel_header_flag::flag_enum lhs, kernel_header_flag rhs) noexcept { \
84  return kernel_header_flag::flag_type(lhs) op kernel_header_flag::flag_type(rhs); \
85  } \
86  inline return_type \
87  operator op(kernel_header_flag lhs, kernel_header_flag::flag_enum rhs) noexcept { \
88  return kernel_header_flag::flag_type(lhs) op kernel_header_flag::flag_type(rhs); \
89  }
90 
91  MAKE_UNARY(~)
92  MAKE_BINARY(|, kernel_header_flag)
93  MAKE_BINARY(&, kernel_header_flag)
94  MAKE_BINARY(^, kernel_header_flag)
95  MAKE_BINARY(==, bool)
96  MAKE_BINARY(!=, bool)
97 
98  #undef MAKE_UNARY
99  #undef MAKE_BINARY
100 
101 }
102 
103 #endif // vim:filetype=cpp
Definition: kernel_header_flag.hh:10