Voyant API 0.2.1
Loading...
Searching...
No Matches
capnp_wrapper.h
Go to the documentation of this file.
1// Copyright (c) 2024-2025 Voyant Photonics, Inc.
2// All rights reserved.
3
4#pragma once
5
6#include <capnp/message.h>
7#include <capnp/serialize.h>
8#include <cstring>
9#include <memory>
10#include <ostream>
11#include <stdexcept>
12#include <vector>
13
22template <typename T> class CapnpWrapper
23{
24public:
28 virtual ~CapnpWrapper() = default;
29
35 virtual void fromProto(typename T::Reader reader) = 0;
36
42 virtual void toProto(typename T::Builder &builder) const = 0;
43
49 virtual void debugString(std::ostream &os) const = 0;
50
66 void fromBuffer(const uint8_t *buffer, size_t size)
67 {
68 kj::ArrayPtr<const capnp::word> words(reinterpret_cast<const capnp::word *>(buffer),
69 size / sizeof(capnp::word));
70 capnp::FlatArrayMessageReader message = capnp::FlatArrayMessageReader(words);
71 typename T::Reader reader = message.getRoot<T>();
72 fromProto(reader);
73 }
74
83 size_t toBuffer(uint8_t *buffer, size_t buffer_size) const
84 {
85 capnp::MallocMessageBuilder message;
86 {
87 typename T::Builder builder = message.getRoot<T>();
88 toProto(builder);
89 }
90 kj::Array<capnp::word> words = capnp::messageToFlatArray(message);
91 size_t size = words.size() * sizeof(capnp::word);
92
93 if(size > buffer_size)
94 {
95 throw std::runtime_error("Buffer too small");
96 }
97
98 std::memcpy(buffer, words.begin(), size);
99 return size;
100 }
101
109 friend std::ostream &operator<<(std::ostream &os, const CapnpWrapper<T> &wrapper)
110 {
111 wrapper.debugString(os);
112 return os;
113 }
114};
Base template class for Cap'n Proto wrappers.
Definition capnp_wrapper.h:23
virtual void toProto(typename T::Builder &builder) const =0
Write wrapper fields to a Cap'n Proto builder.
virtual ~CapnpWrapper()=default
Virtual destructor for proper cleanup in derived classes.
virtual void debugString(std::ostream &os) const =0
Generate a debug string representation.
size_t toBuffer(uint8_t *buffer, size_t buffer_size) const
Serialize this wrapper to a buffer using Cap'n Proto format.
Definition capnp_wrapper.h:83
virtual void fromProto(typename T::Reader reader)=0
Update wrapper fields from a Cap'n Proto reader.
friend std::ostream & operator<<(std::ostream &os, const CapnpWrapper< T > &wrapper)
Output operator for streaming any derived wrapper class.
Definition capnp_wrapper.h:109
void fromBuffer(const uint8_t *buffer, size_t size)
Update wrapper fields from a serialized message buffer.
Definition capnp_wrapper.h:66