annotate osx/include/capnp/generated-header-support.h @ 83:ae30d91d2ffe

Replace these with versions built using an older toolset (so as to avoid ABI compatibilities when linking on Ubuntu 14.04 for packaging purposes)
author Chris Cannam
date Fri, 07 Feb 2020 11:51:13 +0000
parents 0994c39f1e94
children
rev   line source
cannam@62 1 // Copyright (c) 2013-2014 Sandstorm Development Group, Inc. and contributors
cannam@62 2 // Licensed under the MIT License:
cannam@62 3 //
cannam@62 4 // Permission is hereby granted, free of charge, to any person obtaining a copy
cannam@62 5 // of this software and associated documentation files (the "Software"), to deal
cannam@62 6 // in the Software without restriction, including without limitation the rights
cannam@62 7 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
cannam@62 8 // copies of the Software, and to permit persons to whom the Software is
cannam@62 9 // furnished to do so, subject to the following conditions:
cannam@62 10 //
cannam@62 11 // The above copyright notice and this permission notice shall be included in
cannam@62 12 // all copies or substantial portions of the Software.
cannam@62 13 //
cannam@62 14 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
cannam@62 15 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
cannam@62 16 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
cannam@62 17 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
cannam@62 18 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
cannam@62 19 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
cannam@62 20 // THE SOFTWARE.
cannam@62 21
cannam@62 22 // This file is included from all generated headers.
cannam@62 23
cannam@62 24 #ifndef CAPNP_GENERATED_HEADER_SUPPORT_H_
cannam@62 25 #define CAPNP_GENERATED_HEADER_SUPPORT_H_
cannam@62 26
cannam@62 27 #if defined(__GNUC__) && !defined(CAPNP_HEADER_WARNINGS)
cannam@62 28 #pragma GCC system_header
cannam@62 29 #endif
cannam@62 30
cannam@62 31 #include "raw-schema.h"
cannam@62 32 #include "layout.h"
cannam@62 33 #include "list.h"
cannam@62 34 #include "orphan.h"
cannam@62 35 #include "pointer-helpers.h"
cannam@62 36 #include "any.h"
cannam@62 37 #include <kj/string.h>
cannam@62 38 #include <kj/string-tree.h>
cannam@62 39
cannam@62 40 namespace capnp {
cannam@62 41
cannam@62 42 class MessageBuilder; // So that it can be declared a friend.
cannam@62 43
cannam@62 44 template <typename T, Kind k = CAPNP_KIND(T)>
cannam@62 45 struct ToDynamic_; // Defined in dynamic.h, needs to be declared as everyone's friend.
cannam@62 46
cannam@62 47 struct DynamicStruct; // So that it can be declared a friend.
cannam@62 48
cannam@62 49 struct Capability; // To declare brandBindingFor<Capability>()
cannam@62 50
cannam@62 51 namespace _ { // private
cannam@62 52
cannam@62 53 #if !CAPNP_LITE
cannam@62 54
cannam@62 55 template <typename T, typename CapnpPrivate = typename T::_capnpPrivate, bool = false>
cannam@62 56 inline const RawSchema& rawSchema() {
cannam@62 57 return *CapnpPrivate::schema;
cannam@62 58 }
cannam@62 59 template <typename T, uint64_t id = schemas::EnumInfo<T>::typeId>
cannam@62 60 inline const RawSchema& rawSchema() {
cannam@62 61 return *schemas::EnumInfo<T>::schema;
cannam@62 62 }
cannam@62 63
cannam@62 64 template <typename T, typename CapnpPrivate = typename T::_capnpPrivate>
cannam@62 65 inline const RawBrandedSchema& rawBrandedSchema() {
cannam@62 66 return *CapnpPrivate::brand();
cannam@62 67 }
cannam@62 68 template <typename T, uint64_t id = schemas::EnumInfo<T>::typeId>
cannam@62 69 inline const RawBrandedSchema& rawBrandedSchema() {
cannam@62 70 return schemas::EnumInfo<T>::schema->defaultBrand;
cannam@62 71 }
cannam@62 72
cannam@62 73 template <typename TypeTag, typename... Params>
cannam@62 74 struct ChooseBrand;
cannam@62 75 // If all of `Params` are `AnyPointer`, return the type's default brand. Otherwise, return a
cannam@62 76 // specific brand instance. TypeTag is the _capnpPrivate struct for the type in question.
cannam@62 77
cannam@62 78 template <typename TypeTag>
cannam@62 79 struct ChooseBrand<TypeTag> {
cannam@62 80 // All params were AnyPointer. No specific brand needed.
cannam@62 81 static constexpr _::RawBrandedSchema const* brand() { return &TypeTag::schema->defaultBrand; }
cannam@62 82 };
cannam@62 83
cannam@62 84 template <typename TypeTag, typename... Rest>
cannam@62 85 struct ChooseBrand<TypeTag, AnyPointer, Rest...>: public ChooseBrand<TypeTag, Rest...> {};
cannam@62 86 // The first parameter is AnyPointer, so recurse to check the rest.
cannam@62 87
cannam@62 88 template <typename TypeTag, typename First, typename... Rest>
cannam@62 89 struct ChooseBrand<TypeTag, First, Rest...> {
cannam@62 90 // At least one parameter is not AnyPointer, so use the specificBrand constant.
cannam@62 91 static constexpr _::RawBrandedSchema const* brand() { return &TypeTag::specificBrand; }
cannam@62 92 };
cannam@62 93
cannam@62 94 template <typename T, Kind k = kind<T>()>
cannam@62 95 struct BrandBindingFor_;
cannam@62 96
cannam@62 97 #define HANDLE_TYPE(Type, which) \
cannam@62 98 template <> \
cannam@62 99 struct BrandBindingFor_<Type, Kind::PRIMITIVE> { \
cannam@62 100 static constexpr RawBrandedSchema::Binding get(uint16_t listDepth) { \
cannam@62 101 return { which, listDepth, nullptr }; \
cannam@62 102 } \
cannam@62 103 }
cannam@62 104 HANDLE_TYPE(Void, 0);
cannam@62 105 HANDLE_TYPE(bool, 1);
cannam@62 106 HANDLE_TYPE(int8_t, 2);
cannam@62 107 HANDLE_TYPE(int16_t, 3);
cannam@62 108 HANDLE_TYPE(int32_t, 4);
cannam@62 109 HANDLE_TYPE(int64_t, 5);
cannam@62 110 HANDLE_TYPE(uint8_t, 6);
cannam@62 111 HANDLE_TYPE(uint16_t, 7);
cannam@62 112 HANDLE_TYPE(uint32_t, 8);
cannam@62 113 HANDLE_TYPE(uint64_t, 9);
cannam@62 114 HANDLE_TYPE(float, 10);
cannam@62 115 HANDLE_TYPE(double, 11);
cannam@62 116 #undef HANDLE_TYPE
cannam@62 117
cannam@62 118 template <>
cannam@62 119 struct BrandBindingFor_<Text, Kind::BLOB> {
cannam@62 120 static constexpr RawBrandedSchema::Binding get(uint16_t listDepth) {
cannam@62 121 return { 12, listDepth, nullptr };
cannam@62 122 }
cannam@62 123 };
cannam@62 124
cannam@62 125 template <>
cannam@62 126 struct BrandBindingFor_<Data, Kind::BLOB> {
cannam@62 127 static constexpr RawBrandedSchema::Binding get(uint16_t listDepth) {
cannam@62 128 return { 13, listDepth, nullptr };
cannam@62 129 }
cannam@62 130 };
cannam@62 131
cannam@62 132 template <typename T>
cannam@62 133 struct BrandBindingFor_<List<T>, Kind::LIST> {
cannam@62 134 static constexpr RawBrandedSchema::Binding get(uint16_t listDepth) {
cannam@62 135 return BrandBindingFor_<T>::get(listDepth + 1);
cannam@62 136 }
cannam@62 137 };
cannam@62 138
cannam@62 139 template <typename T>
cannam@62 140 struct BrandBindingFor_<T, Kind::ENUM> {
cannam@62 141 static constexpr RawBrandedSchema::Binding get(uint16_t listDepth) {
cannam@62 142 return { 15, listDepth, nullptr };
cannam@62 143 }
cannam@62 144 };
cannam@62 145
cannam@62 146 template <typename T>
cannam@62 147 struct BrandBindingFor_<T, Kind::STRUCT> {
cannam@62 148 static constexpr RawBrandedSchema::Binding get(uint16_t listDepth) {
cannam@62 149 return { 16, listDepth, T::_capnpPrivate::brand() };
cannam@62 150 }
cannam@62 151 };
cannam@62 152
cannam@62 153 template <typename T>
cannam@62 154 struct BrandBindingFor_<T, Kind::INTERFACE> {
cannam@62 155 static constexpr RawBrandedSchema::Binding get(uint16_t listDepth) {
cannam@62 156 return { 17, listDepth, T::_capnpPrivate::brand() };
cannam@62 157 }
cannam@62 158 };
cannam@62 159
cannam@62 160 template <>
cannam@62 161 struct BrandBindingFor_<AnyPointer, Kind::OTHER> {
cannam@62 162 static constexpr RawBrandedSchema::Binding get(uint16_t listDepth) {
cannam@62 163 return { 18, listDepth, 0, 0 };
cannam@62 164 }
cannam@62 165 };
cannam@62 166
cannam@62 167 template <>
cannam@62 168 struct BrandBindingFor_<AnyStruct, Kind::OTHER> {
cannam@62 169 static constexpr RawBrandedSchema::Binding get(uint16_t listDepth) {
cannam@62 170 return { 18, listDepth, 0, 1 };
cannam@62 171 }
cannam@62 172 };
cannam@62 173
cannam@62 174 template <>
cannam@62 175 struct BrandBindingFor_<AnyList, Kind::OTHER> {
cannam@62 176 static constexpr RawBrandedSchema::Binding get(uint16_t listDepth) {
cannam@62 177 return { 18, listDepth, 0, 2 };
cannam@62 178 }
cannam@62 179 };
cannam@62 180
cannam@62 181 template <>
cannam@62 182 struct BrandBindingFor_<Capability, Kind::OTHER> {
cannam@62 183 static constexpr RawBrandedSchema::Binding get(uint16_t listDepth) {
cannam@62 184 return { 18, listDepth, 0, 3 };
cannam@62 185 }
cannam@62 186 };
cannam@62 187
cannam@62 188 template <typename T>
cannam@62 189 constexpr RawBrandedSchema::Binding brandBindingFor() {
cannam@62 190 return BrandBindingFor_<T>::get(0);
cannam@62 191 }
cannam@62 192
cannam@62 193 kj::StringTree structString(StructReader reader, const RawBrandedSchema& schema);
cannam@62 194 kj::String enumString(uint16_t value, const RawBrandedSchema& schema);
cannam@62 195 // Declared here so that we can declare inline stringify methods on generated types.
cannam@62 196 // Defined in stringify.c++, which depends on dynamic.c++, which is allowed not to be linked in.
cannam@62 197
cannam@62 198 template <typename T>
cannam@62 199 inline kj::StringTree structString(StructReader reader) {
cannam@62 200 return structString(reader, rawBrandedSchema<T>());
cannam@62 201 }
cannam@62 202 template <typename T>
cannam@62 203 inline kj::String enumString(T value) {
cannam@62 204 return enumString(static_cast<uint16_t>(value), rawBrandedSchema<T>());
cannam@62 205 }
cannam@62 206
cannam@62 207 #endif // !CAPNP_LITE
cannam@62 208
cannam@62 209 // TODO(cleanup): Unify ConstStruct and ConstList.
cannam@62 210 template <typename T>
cannam@62 211 class ConstStruct {
cannam@62 212 public:
cannam@62 213 ConstStruct() = delete;
cannam@62 214 KJ_DISALLOW_COPY(ConstStruct);
cannam@62 215 inline explicit constexpr ConstStruct(const word* ptr): ptr(ptr) {}
cannam@62 216
cannam@62 217 inline typename T::Reader get() const {
cannam@62 218 return AnyPointer::Reader(PointerReader::getRootUnchecked(ptr)).getAs<T>();
cannam@62 219 }
cannam@62 220
cannam@62 221 inline operator typename T::Reader() const { return get(); }
cannam@62 222 inline typename T::Reader operator*() const { return get(); }
cannam@62 223 inline TemporaryPointer<typename T::Reader> operator->() const { return get(); }
cannam@62 224
cannam@62 225 private:
cannam@62 226 const word* ptr;
cannam@62 227 };
cannam@62 228
cannam@62 229 template <typename T>
cannam@62 230 class ConstList {
cannam@62 231 public:
cannam@62 232 ConstList() = delete;
cannam@62 233 KJ_DISALLOW_COPY(ConstList);
cannam@62 234 inline explicit constexpr ConstList(const word* ptr): ptr(ptr) {}
cannam@62 235
cannam@62 236 inline typename List<T>::Reader get() const {
cannam@62 237 return AnyPointer::Reader(PointerReader::getRootUnchecked(ptr)).getAs<List<T>>();
cannam@62 238 }
cannam@62 239
cannam@62 240 inline operator typename List<T>::Reader() const { return get(); }
cannam@62 241 inline typename List<T>::Reader operator*() const { return get(); }
cannam@62 242 inline TemporaryPointer<typename List<T>::Reader> operator->() const { return get(); }
cannam@62 243
cannam@62 244 private:
cannam@62 245 const word* ptr;
cannam@62 246 };
cannam@62 247
cannam@62 248 template <size_t size>
cannam@62 249 class ConstText {
cannam@62 250 public:
cannam@62 251 ConstText() = delete;
cannam@62 252 KJ_DISALLOW_COPY(ConstText);
cannam@62 253 inline explicit constexpr ConstText(const word* ptr): ptr(ptr) {}
cannam@62 254
cannam@62 255 inline Text::Reader get() const {
cannam@62 256 return Text::Reader(reinterpret_cast<const char*>(ptr), size);
cannam@62 257 }
cannam@62 258
cannam@62 259 inline operator Text::Reader() const { return get(); }
cannam@62 260 inline Text::Reader operator*() const { return get(); }
cannam@62 261 inline TemporaryPointer<Text::Reader> operator->() const { return get(); }
cannam@62 262
cannam@62 263 inline kj::StringPtr toString() const {
cannam@62 264 return get();
cannam@62 265 }
cannam@62 266
cannam@62 267 private:
cannam@62 268 const word* ptr;
cannam@62 269 };
cannam@62 270
cannam@62 271 template <size_t size>
cannam@62 272 inline kj::StringPtr KJ_STRINGIFY(const ConstText<size>& s) {
cannam@62 273 return s.get();
cannam@62 274 }
cannam@62 275
cannam@62 276 template <size_t size>
cannam@62 277 class ConstData {
cannam@62 278 public:
cannam@62 279 ConstData() = delete;
cannam@62 280 KJ_DISALLOW_COPY(ConstData);
cannam@62 281 inline explicit constexpr ConstData(const word* ptr): ptr(ptr) {}
cannam@62 282
cannam@62 283 inline Data::Reader get() const {
cannam@62 284 return Data::Reader(reinterpret_cast<const byte*>(ptr), size);
cannam@62 285 }
cannam@62 286
cannam@62 287 inline operator Data::Reader() const { return get(); }
cannam@62 288 inline Data::Reader operator*() const { return get(); }
cannam@62 289 inline TemporaryPointer<Data::Reader> operator->() const { return get(); }
cannam@62 290
cannam@62 291 private:
cannam@62 292 const word* ptr;
cannam@62 293 };
cannam@62 294
cannam@62 295 template <size_t size>
cannam@62 296 inline auto KJ_STRINGIFY(const ConstData<size>& s) -> decltype(kj::toCharSequence(s.get())) {
cannam@62 297 return kj::toCharSequence(s.get());
cannam@62 298 }
cannam@62 299
cannam@62 300 } // namespace _ (private)
cannam@62 301
cannam@62 302 template <typename T, typename CapnpPrivate = typename T::_capnpPrivate>
cannam@62 303 inline constexpr uint64_t typeId() { return CapnpPrivate::typeId; }
cannam@62 304 template <typename T, uint64_t id = schemas::EnumInfo<T>::typeId>
cannam@62 305 inline constexpr uint64_t typeId() { return id; }
cannam@62 306 // typeId<MyType>() returns the type ID as defined in the schema. Works with structs, enums, and
cannam@62 307 // interfaces.
cannam@62 308
cannam@62 309 template <typename T>
cannam@62 310 inline constexpr uint sizeInWords() {
cannam@62 311 // Return the size, in words, of a Struct type, if allocated free-standing (not in a list).
cannam@62 312 // May be useful for pre-computing space needed in order to precisely allocate messages.
cannam@62 313
cannam@62 314 return unbound((upgradeBound<uint>(_::structSize<T>().data) +
cannam@62 315 _::structSize<T>().pointers * WORDS_PER_POINTER) / WORDS);
cannam@62 316 }
cannam@62 317
cannam@62 318 } // namespace capnp
cannam@62 319
cannam@62 320 #if _MSC_VER
cannam@62 321 // MSVC doesn't understand floating-point constexpr yet.
cannam@62 322 //
cannam@62 323 // TODO(msvc): Remove this hack when MSVC is fixed.
cannam@62 324 #define CAPNP_NON_INT_CONSTEXPR_DECL_INIT(value)
cannam@62 325 #define CAPNP_NON_INT_CONSTEXPR_DEF_INIT(value) = value
cannam@62 326 #else
cannam@62 327 #define CAPNP_NON_INT_CONSTEXPR_DECL_INIT(value) = value
cannam@62 328 #define CAPNP_NON_INT_CONSTEXPR_DEF_INIT(value)
cannam@62 329 #endif
cannam@62 330
cannam@62 331 #if _MSC_VER
cannam@62 332 // TODO(msvc): A little hack to allow MSVC to use C++14 return type deduction in cases where the
cannam@62 333 // explicit type exposes bugs in the compiler.
cannam@62 334 #define CAPNP_AUTO_IF_MSVC(...) auto
cannam@62 335 #else
cannam@62 336 #define CAPNP_AUTO_IF_MSVC(...) __VA_ARGS__
cannam@62 337 #endif
cannam@62 338
cannam@62 339 #if CAPNP_LITE
cannam@62 340
cannam@62 341 #define CAPNP_DECLARE_SCHEMA(id) \
cannam@62 342 extern ::capnp::word const* const bp_##id
cannam@62 343
cannam@62 344 #define CAPNP_DECLARE_ENUM(type, id) \
cannam@62 345 inline ::kj::String KJ_STRINGIFY(type##_##id value) { \
cannam@62 346 return ::kj::str(static_cast<uint16_t>(value)); \
cannam@62 347 } \
cannam@62 348 template <> struct EnumInfo<type##_##id> { \
cannam@62 349 struct IsEnum; \
cannam@62 350 static constexpr uint64_t typeId = 0x##id; \
cannam@62 351 static inline ::capnp::word const* encodedSchema() { return bp_##id; } \
cannam@62 352 }
cannam@62 353
cannam@62 354 #if _MSC_VER
cannam@62 355 // TODO(msvc): MSVC dosen't expect constexprs to have definitions.
cannam@62 356 #define CAPNP_DEFINE_ENUM(type, id)
cannam@62 357 #else
cannam@62 358 #define CAPNP_DEFINE_ENUM(type, id) \
cannam@62 359 constexpr uint64_t EnumInfo<type>::typeId
cannam@62 360 #endif
cannam@62 361
cannam@62 362 #define CAPNP_DECLARE_STRUCT_HEADER(id, dataWordSize_, pointerCount_) \
cannam@62 363 struct IsStruct; \
cannam@62 364 static constexpr uint64_t typeId = 0x##id; \
cannam@62 365 static constexpr uint16_t dataWordSize = dataWordSize_; \
cannam@62 366 static constexpr uint16_t pointerCount = pointerCount_; \
cannam@62 367 static inline ::capnp::word const* encodedSchema() { return ::capnp::schemas::bp_##id; }
cannam@62 368
cannam@62 369 #else // CAPNP_LITE
cannam@62 370
cannam@62 371 #define CAPNP_DECLARE_SCHEMA(id) \
cannam@62 372 extern ::capnp::word const* const bp_##id; \
cannam@62 373 extern const ::capnp::_::RawSchema s_##id
cannam@62 374
cannam@62 375 #define CAPNP_DECLARE_ENUM(type, id) \
cannam@62 376 inline ::kj::String KJ_STRINGIFY(type##_##id value) { \
cannam@62 377 return ::capnp::_::enumString(value); \
cannam@62 378 } \
cannam@62 379 template <> struct EnumInfo<type##_##id> { \
cannam@62 380 struct IsEnum; \
cannam@62 381 static constexpr uint64_t typeId = 0x##id; \
cannam@62 382 static inline ::capnp::word const* encodedSchema() { return bp_##id; } \
cannam@62 383 static constexpr ::capnp::_::RawSchema const* schema = &s_##id; \
cannam@62 384 }
cannam@62 385 #define CAPNP_DEFINE_ENUM(type, id) \
cannam@62 386 constexpr uint64_t EnumInfo<type>::typeId; \
cannam@62 387 constexpr ::capnp::_::RawSchema const* EnumInfo<type>::schema
cannam@62 388
cannam@62 389 #define CAPNP_DECLARE_STRUCT_HEADER(id, dataWordSize_, pointerCount_) \
cannam@62 390 struct IsStruct; \
cannam@62 391 static constexpr uint64_t typeId = 0x##id; \
cannam@62 392 static constexpr ::capnp::Kind kind = ::capnp::Kind::STRUCT; \
cannam@62 393 static constexpr uint16_t dataWordSize = dataWordSize_; \
cannam@62 394 static constexpr uint16_t pointerCount = pointerCount_; \
cannam@62 395 static inline ::capnp::word const* encodedSchema() { return ::capnp::schemas::bp_##id; } \
cannam@62 396 static constexpr ::capnp::_::RawSchema const* schema = &::capnp::schemas::s_##id;
cannam@62 397
cannam@62 398 #define CAPNP_DECLARE_INTERFACE_HEADER(id) \
cannam@62 399 struct IsInterface; \
cannam@62 400 static constexpr uint64_t typeId = 0x##id; \
cannam@62 401 static constexpr ::capnp::Kind kind = ::capnp::Kind::INTERFACE; \
cannam@62 402 static inline ::capnp::word const* encodedSchema() { return ::capnp::schemas::bp_##id; } \
cannam@62 403 static constexpr ::capnp::_::RawSchema const* schema = &::capnp::schemas::s_##id;
cannam@62 404
cannam@62 405 #endif // CAPNP_LITE, else
cannam@62 406
cannam@62 407 #endif // CAPNP_GENERATED_HEADER_SUPPORT_H_