Apollo 10.0
自动驾驶开放平台
arena_message_wrapper.h
浏览该文件的文档.
1/******************************************************************************
2 * Copyright 2024 The Apollo Authors. All Rights Reserved.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *****************************************************************************/
16#ifndef CYBER_MESSAGE_ARENA_MESSAGE_WRAPPER_H_
17#define CYBER_MESSAGE_ARENA_MESSAGE_WRAPPER_H_
18
19#include <cstdint>
20#include <cstring>
21#include <memory>
22
24
25namespace apollo {
26namespace cyber {
27namespace message {
28
30 struct {
31 uint64_t version_;
32 uint64_t addr_offset_;
34 uint8_t bytes_[128];
35};
36
38 uint8_t bytes_[256];
39};
40
48
50 public:
51 static const uint64_t kDefaultVersion = 1L;
52
53 ArenaMessageWrapper() : arena_manager_(nullptr) {
56 }
57
58 explicit ArenaMessageWrapper(ArenaManagerBase* arena_manager)
59 : arena_manager_(arena_manager) {
62 }
63
65
66 void SetVersion(uint64_t version) {
67 data_.struct_.meta_.struct_.version_ = version;
68 }
69 uint64_t GetVersion() const { return data_.struct_.meta_.struct_.version_; }
70
71 uint64_t GetMessageAddress() const {
72 return arena_manager_->GetBaseAddress(this) +
74 }
75
76 void* GetData() { return reinterpret_cast<void*>(data_.bytes_); }
77
78 bool FillMeta(void* meta, uint64_t size) {
79 if (size > 128) {
80 return false;
81 }
82 memcpy(&data_.struct_.meta_, meta, size);
83 return true;
84 }
85
87 return reinterpret_cast<ArenaMessageWrapperMeta*>(
88 data_.struct_.meta_.bytes_);
89 }
90
91 bool FillExtended(void* extended, uint64_t size) {
92 if (size > 256) {
93 return false;
94 }
95 memcpy(&data_.struct_.extended_, extended, size);
96 return true;
97 }
98
99 template <typename T>
101 return reinterpret_cast<T*>(data_.struct_.extended_.bytes_);
102 }
103
104 template <typename MessageT>
105 MessageT* GetMessage() {
106 // uint64_t base_address =
107 // reinterpret_cast<uint64_t>(arena_manager_->GetBaseAddress());
108 // uint64_t message_address = base_address + data_.struct_.addr_offset_;
109 // return std::shared_ptr<MessageT>(
110 // reinterpret_cast<MessageT*>(GetMessageAddress()));
111 auto msg_ptr = arena_manager_->GetMessage<MessageT>(this);
112 return msg_ptr;
113 }
114
115 template <typename MessageT>
116 MessageT* SetMessage(const MessageT& message) {
117 auto msg_ptr = arena_manager_->SetMessage(this, message);
118 return msg_ptr;
119 }
120
121 private:
122 // union {
123 // struct {
124 // union {
125 // uint64_t version_;
126 // uint64_t addr_offset_;
127 // uint8_t bytes_[128];
128 // } meta_;
129 // union {
130 // uint8_t bytes_[256];
131 // } extended_;
132 // } struct_;
133 // uint8_t bytes_[1024];
134 // } data_;
136 // message holder
137 std::shared_ptr<void*> message_;
138 ArenaManagerBase* arena_manager_;
139};
140
141} // namespace message
142} // namespace cyber
143} // namespace apollo
144
145#endif
virtual void * SetMessage(ArenaMessageWrapper *wrapper, const void *message)=0
virtual uint64_t GetBaseAddress(const ArenaMessageWrapper *wrapper)
virtual void * GetMessage(ArenaMessageWrapper *wrapper)=0
ArenaMessageWrapper(ArenaManagerBase *arena_manager)
MessageT * SetMessage(const MessageT &message)
bool FillExtended(void *extended, uint64_t size)
class register implement
Definition arena_queue.h:37
struct apollo::cyber::message::ArenaMessageWrapperDataStruct::@1 struct_
struct apollo::cyber::message::ArenaMessageWrapperMeta::@0 struct_