Pigweed
Loading...
Searching...
No Matches
capability.h
1// Copyright 2024 The Pigweed Authors
2//
3// Licensed under the Apache License, Version 2.0 (the "License"); you may not
4// use this file except in compliance with the License. You may obtain a copy of
5// the License at
6//
7// https://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12// License for the specific language governing permissions and limitations under
13// the License.
14#pragma once
15
16#include <cstdint>
17
18#include "pw_assert/assert.h"
19
20namespace pw::allocator {
21
28enum Capability : uint32_t {
29 // clang-format off
30 kImplementsGetRequestedLayout = 1 << 0,
31 kImplementsGetUsableLayout = 1 << 1,
32 kImplementsGetAllocatedLayout = 1 << 2,
33 kImplementsGetCapacity = 1 << 4,
34 kImplementsRecognizes = 1 << 5,
35 kSkipsDestroy = 1 << 6,
36 // clang-format on
37};
38
65 public:
66 constexpr Capabilities() : capabilities_(0) {}
67 constexpr Capabilities(uint32_t capabilities) : capabilities_(capabilities) {}
68
69 constexpr bool has(Capability capability) const {
70 return (capabilities_ & capability) == capability;
71 }
72
73 constexpr uint32_t get() const { return capabilities_; }
74
75 private:
76 const uint32_t capabilities_;
77};
78
79inline constexpr bool operator==(const Capabilities& lhs,
80 const Capabilities& rhs) {
81 return lhs.get() == rhs.get();
82}
83
84inline constexpr bool operator!=(const Capabilities& lhs,
85 const Capabilities& rhs) {
86 return lhs.get() != rhs.get();
87}
88
89inline constexpr Capabilities operator|(const Capabilities& lhs,
90 const Capabilities& rhs) {
91 return Capabilities(lhs.get() | rhs.get());
92}
93
94inline constexpr Capabilities operator&(const Capabilities& lhs,
95 const Capabilities& rhs) {
96 return Capabilities(lhs.get() & rhs.get());
97}
98
99inline constexpr Capabilities operator^(const Capabilities& lhs,
100 const Capabilities& rhs) {
101 return Capabilities(lhs.get() ^ rhs.get());
102}
103
104} // namespace pw::allocator
Definition: capability.h:64