aboutsummaryrefslogtreecommitdiff
path: root/pw_rpc/public/pw_rpc/method_id.h
diff options
context:
space:
mode:
Diffstat (limited to 'pw_rpc/public/pw_rpc/method_id.h')
-rw-r--r--pw_rpc/public/pw_rpc/method_id.h75
1 files changed, 75 insertions, 0 deletions
diff --git a/pw_rpc/public/pw_rpc/method_id.h b/pw_rpc/public/pw_rpc/method_id.h
new file mode 100644
index 000000000..8527aba19
--- /dev/null
+++ b/pw_rpc/public/pw_rpc/method_id.h
@@ -0,0 +1,75 @@
+// Copyright 2022 The Pigweed Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License"); you may not
+// use this file except in compliance with the License. You may obtain a copy of
+// the License at
+//
+// https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations under
+// the License.
+#pragma once
+
+#include <cstdint>
+#include <functional>
+
+// NOTE: These wrappers exist in order to provide future compatibility for
+// different internal representations of method identifiers.
+
+namespace pw::rpc {
+
+class MethodId;
+
+namespace internal {
+constexpr MethodId WrapMethodId(uint32_t id);
+constexpr uint32_t UnwrapMethodId(MethodId id);
+} // namespace internal
+
+// An identifier for a method.
+class MethodId {
+ private:
+ constexpr explicit MethodId(uint32_t id) : id_(id) {}
+ friend constexpr MethodId internal::WrapMethodId(uint32_t id);
+ friend constexpr uint32_t internal::UnwrapMethodId(MethodId id);
+ uint32_t id_;
+};
+
+constexpr bool operator==(MethodId lhs, MethodId rhs) {
+ return internal::UnwrapMethodId(lhs) == internal::UnwrapMethodId(rhs);
+}
+
+constexpr bool operator!=(MethodId lhs, MethodId rhs) { return !(lhs == rhs); }
+
+// Comparisons are provided to enable sorting by `MethodId`.
+
+constexpr bool operator<(MethodId lhs, MethodId rhs) {
+ return internal::UnwrapMethodId(lhs) < internal::UnwrapMethodId(rhs);
+}
+
+constexpr bool operator>(MethodId lhs, MethodId rhs) { return rhs < lhs; }
+
+constexpr bool operator<=(MethodId lhs, MethodId rhs) { return !(lhs > rhs); }
+
+constexpr bool operator>=(MethodId lhs, MethodId rhs) { return !(lhs < rhs); }
+
+namespace internal {
+
+constexpr MethodId WrapMethodId(uint32_t id) { return MethodId(id); }
+constexpr uint32_t UnwrapMethodId(MethodId id) { return id.id_; }
+
+} // namespace internal
+} // namespace pw::rpc
+
+namespace std {
+
+template <>
+struct hash<pw::rpc::MethodId> {
+ size_t operator()(const pw::rpc::MethodId& id) const {
+ return hash<uint32_t>{}(::pw::rpc::internal::UnwrapMethodId(id));
+ }
+};
+
+} // namespace std