comparison win64-msvc/include/capnp/generated-header-support.h @ 148:b4bfdf10c4b3

Update Win64 capnp builds to v0.6
author Chris Cannam <cannam@all-day-breakfast.com>
date Mon, 22 May 2017 18:56:49 +0100
parents 42a73082be24
children
comparison
equal deleted inserted replaced
147:45360b968bf4 148:b4bfdf10c4b3
17 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20 // THE SOFTWARE. 20 // THE SOFTWARE.
21 21
22 // This file is included form all generated headers. 22 // This file is included from all generated headers.
23 23
24 #ifndef CAPNP_GENERATED_HEADER_SUPPORT_H_ 24 #ifndef CAPNP_GENERATED_HEADER_SUPPORT_H_
25 #define CAPNP_GENERATED_HEADER_SUPPORT_H_ 25 #define CAPNP_GENERATED_HEADER_SUPPORT_H_
26 26
27 #if defined(__GNUC__) && !defined(CAPNP_HEADER_WARNINGS) 27 #if defined(__GNUC__) && !defined(CAPNP_HEADER_WARNINGS)
28 #pragma GCC system_header 28 #pragma GCC system_header
29 #endif 29 #endif
30 30
31 #include "raw-schema.h"
31 #include "layout.h" 32 #include "layout.h"
32 #include "list.h" 33 #include "list.h"
33 #include "orphan.h" 34 #include "orphan.h"
34 #include "pointer-helpers.h" 35 #include "pointer-helpers.h"
35 #include "any.h" 36 #include "any.h"
49 50
50 namespace _ { // private 51 namespace _ { // private
51 52
52 #if !CAPNP_LITE 53 #if !CAPNP_LITE
53 54
54 struct RawSchema;
55
56 struct RawBrandedSchema {
57 // Represents a combination of a schema and bindings for its generic parameters.
58 //
59 // Note that while we generate one `RawSchema` per type, we generate a `RawBrandedSchema` for
60 // every _instance_ of a generic type -- or, at least, every instance that is actually used. For
61 // generated-code types, we use template magic to initialize these.
62
63 const RawSchema* generic;
64 // Generic type which we're branding.
65
66 struct Binding {
67 uint8_t which; // Numeric value of one of schema::Type::Which.
68
69 bool isImplicitParameter;
70 // For AnyPointer, true if it's an implicit method parameter.
71
72 uint16_t listDepth; // Number of times to wrap the base type in List().
73
74 uint16_t paramIndex;
75 // For AnyPointer. If it's a type parameter (scopeId is non-zero) or it's an implicit parameter
76 // (isImplicitParameter is true), then this is the parameter index. Otherwise this is a numeric
77 // value of one of schema::Type::AnyPointer::Unconstrained::Which.
78
79 union {
80 const RawBrandedSchema* schema; // for struct, enum, interface
81 uint64_t scopeId; // for AnyPointer, if it's a type parameter
82 };
83
84 Binding() = default;
85 inline constexpr Binding(uint8_t which, uint16_t listDepth, const RawBrandedSchema* schema)
86 : which(which), isImplicitParameter(false), listDepth(listDepth), paramIndex(0),
87 schema(schema) {}
88 inline constexpr Binding(uint8_t which, uint16_t listDepth,
89 uint64_t scopeId, uint16_t paramIndex)
90 : which(which), isImplicitParameter(false), listDepth(listDepth), paramIndex(paramIndex),
91 scopeId(scopeId) {}
92 inline constexpr Binding(uint8_t which, uint16_t listDepth, uint16_t implicitParamIndex)
93 : which(which), isImplicitParameter(true), listDepth(listDepth),
94 paramIndex(implicitParamIndex), scopeId(0) {}
95 };
96
97 struct Scope {
98 uint64_t typeId;
99 // Type ID whose parameters are being bound.
100
101 const Binding* bindings;
102 uint bindingCount;
103 // Bindings for those parameters.
104
105 bool isUnbound;
106 // This scope is unbound, in the sense of SchemaLoader::getUnbound().
107 };
108
109 const Scope* scopes;
110 // Array of enclosing scopes for which generic variables have been bound, sorted by type ID.
111
112 struct Dependency {
113 uint location;
114 const RawBrandedSchema* schema;
115 };
116
117 const Dependency* dependencies;
118 // Map of branded schemas for dependencies of this type, given our brand. Only dependencies that
119 // are branded are included in this map; if a dependency is missing, use its `defaultBrand`.
120
121 uint32_t scopeCount;
122 uint32_t dependencyCount;
123
124 enum class DepKind {
125 // Component of a Dependency::location. Specifies what sort of dependency this is.
126
127 INVALID,
128 // Mostly defined to ensure that zero is not a valid location.
129
130 FIELD,
131 // Binding needed for a field's type. The index is the field index (NOT ordinal!).
132
133 METHOD_PARAMS,
134 // Bindings needed for a method's params type. The index is the method number.
135
136 METHOD_RESULTS,
137 // Bindings needed for a method's results type. The index is the method ordinal.
138
139 SUPERCLASS,
140 // Bindings needed for a superclass type. The index is the superclass's index in the
141 // "extends" list.
142
143 CONST_TYPE
144 // Bindings needed for the type of a constant. The index is zero.
145 };
146
147 static inline uint makeDepLocation(DepKind kind, uint index) {
148 // Make a number representing the location of a particular dependency within its parent
149 // schema.
150
151 return (static_cast<uint>(kind) << 24) | index;
152 }
153
154 class Initializer {
155 public:
156 virtual void init(const RawBrandedSchema* generic) const = 0;
157 };
158
159 const Initializer* lazyInitializer;
160 // Lazy initializer, invoked by ensureInitialized().
161
162 inline void ensureInitialized() const {
163 // Lazy initialization support. Invoke to ensure that initialization has taken place. This
164 // is required in particular when traversing the dependency list. RawSchemas for compiled-in
165 // types are always initialized; only dynamically-loaded schemas may be lazy.
166
167 const Initializer* i = __atomic_load_n(&lazyInitializer, __ATOMIC_ACQUIRE);
168 if (i != nullptr) i->init(this);
169 }
170
171 inline bool isUnbound() const;
172 // Checks if this schema is the result of calling SchemaLoader::getUnbound(), in which case
173 // binding lookups need to be handled specially.
174 };
175
176 struct RawSchema {
177 // The generated code defines a constant RawSchema for every compiled declaration.
178 //
179 // This is an internal structure which could change in the future.
180
181 uint64_t id;
182
183 const word* encodedNode;
184 // Encoded SchemaNode, readable via readMessageUnchecked<schema::Node>(encodedNode).
185
186 uint32_t encodedSize;
187 // Size of encodedNode, in words.
188
189 const RawSchema* const* dependencies;
190 // Pointers to other types on which this one depends, sorted by ID. The schemas in this table
191 // may be uninitialized -- you must call ensureInitialized() on the one you wish to use before
192 // using it.
193 //
194 // TODO(someday): Make this a hashtable.
195
196 const uint16_t* membersByName;
197 // Indexes of members sorted by name. Used to implement name lookup.
198 // TODO(someday): Make this a hashtable.
199
200 uint32_t dependencyCount;
201 uint32_t memberCount;
202 // Sizes of above tables.
203
204 const uint16_t* membersByDiscriminant;
205 // List of all member indexes ordered by discriminant value. Those which don't have a
206 // discriminant value are listed at the end, in order by ordinal.
207
208 const RawSchema* canCastTo;
209 // Points to the RawSchema of a compiled-in type to which it is safe to cast any DynamicValue
210 // with this schema. This is null for all compiled-in types; it is only set by SchemaLoader on
211 // dynamically-loaded types.
212
213 class Initializer {
214 public:
215 virtual void init(const RawSchema* schema) const = 0;
216 };
217
218 const Initializer* lazyInitializer;
219 // Lazy initializer, invoked by ensureInitialized().
220
221 inline void ensureInitialized() const {
222 // Lazy initialization support. Invoke to ensure that initialization has taken place. This
223 // is required in particular when traversing the dependency list. RawSchemas for compiled-in
224 // types are always initialized; only dynamically-loaded schemas may be lazy.
225
226 const Initializer* i = __atomic_load_n(&lazyInitializer, __ATOMIC_ACQUIRE);
227 if (i != nullptr) i->init(this);
228 }
229
230 RawBrandedSchema defaultBrand;
231 // Specifies the brand to use for this schema if no generic parameters have been bound to
232 // anything. Generally, in the default brand, all generic parameters are treated as if they were
233 // bound to `AnyPointer`.
234 };
235
236 inline bool RawBrandedSchema::isUnbound() const {
237 // The unbound schema is the only one that has no scopes but is not the default schema.
238 return scopeCount == 0 && this != &generic->defaultBrand;
239 }
240
241 template <typename T, typename CapnpPrivate = typename T::_capnpPrivate, bool = false> 55 template <typename T, typename CapnpPrivate = typename T::_capnpPrivate, bool = false>
242 inline const RawSchema& rawSchema() { 56 inline const RawSchema& rawSchema() {
243 return *CapnpPrivate::schema; 57 return *CapnpPrivate::schema;
244 } 58 }
245 template <typename T, uint64_t id = schemas::EnumInfo<T>::typeId> 59 template <typename T, uint64_t id = schemas::EnumInfo<T>::typeId>
247 return *schemas::EnumInfo<T>::schema; 61 return *schemas::EnumInfo<T>::schema;
248 } 62 }
249 63
250 template <typename T, typename CapnpPrivate = typename T::_capnpPrivate> 64 template <typename T, typename CapnpPrivate = typename T::_capnpPrivate>
251 inline const RawBrandedSchema& rawBrandedSchema() { 65 inline const RawBrandedSchema& rawBrandedSchema() {
252 return *CapnpPrivate::brand; 66 return *CapnpPrivate::brand();
253 } 67 }
254 template <typename T, uint64_t id = schemas::EnumInfo<T>::typeId> 68 template <typename T, uint64_t id = schemas::EnumInfo<T>::typeId>
255 inline const RawBrandedSchema& rawBrandedSchema() { 69 inline const RawBrandedSchema& rawBrandedSchema() {
256 return schemas::EnumInfo<T>::schema->defaultBrand; 70 return schemas::EnumInfo<T>::schema->defaultBrand;
257 } 71 }
262 // specific brand instance. TypeTag is the _capnpPrivate struct for the type in question. 76 // specific brand instance. TypeTag is the _capnpPrivate struct for the type in question.
263 77
264 template <typename TypeTag> 78 template <typename TypeTag>
265 struct ChooseBrand<TypeTag> { 79 struct ChooseBrand<TypeTag> {
266 // All params were AnyPointer. No specific brand needed. 80 // All params were AnyPointer. No specific brand needed.
267 static constexpr _::RawBrandedSchema const* brand = &TypeTag::schema->defaultBrand; 81 static constexpr _::RawBrandedSchema const* brand() { return &TypeTag::schema->defaultBrand; }
268 }; 82 };
269 83
270 template <typename TypeTag, typename... Rest> 84 template <typename TypeTag, typename... Rest>
271 struct ChooseBrand<TypeTag, AnyPointer, Rest...>: public ChooseBrand<TypeTag, Rest...> {}; 85 struct ChooseBrand<TypeTag, AnyPointer, Rest...>: public ChooseBrand<TypeTag, Rest...> {};
272 // The first parameter is AnyPointer, so recurse to check the rest. 86 // The first parameter is AnyPointer, so recurse to check the rest.
273 87
274 template <typename TypeTag, typename First, typename... Rest> 88 template <typename TypeTag, typename First, typename... Rest>
275 struct ChooseBrand<TypeTag, First, Rest...> { 89 struct ChooseBrand<TypeTag, First, Rest...> {
276 // At least one parameter is not AnyPointer, so use the specificBrand constant. 90 // At least one parameter is not AnyPointer, so use the specificBrand constant.
277 static constexpr _::RawBrandedSchema const* brand = &TypeTag::specificBrand; 91 static constexpr _::RawBrandedSchema const* brand() { return &TypeTag::specificBrand; }
278 }; 92 };
279 93
280 template <typename T, Kind k = kind<T>()> 94 template <typename T, Kind k = kind<T>()>
281 struct BrandBindingFor_; 95 struct BrandBindingFor_;
282 96
330 }; 144 };
331 145
332 template <typename T> 146 template <typename T>
333 struct BrandBindingFor_<T, Kind::STRUCT> { 147 struct BrandBindingFor_<T, Kind::STRUCT> {
334 static constexpr RawBrandedSchema::Binding get(uint16_t listDepth) { 148 static constexpr RawBrandedSchema::Binding get(uint16_t listDepth) {
335 return { 16, listDepth, T::_capnpPrivate::brand }; 149 return { 16, listDepth, T::_capnpPrivate::brand() };
336 } 150 }
337 }; 151 };
338 152
339 template <typename T> 153 template <typename T>
340 struct BrandBindingFor_<T, Kind::INTERFACE> { 154 struct BrandBindingFor_<T, Kind::INTERFACE> {
341 static constexpr RawBrandedSchema::Binding get(uint16_t listDepth) { 155 static constexpr RawBrandedSchema::Binding get(uint16_t listDepth) {
342 return { 17, listDepth, T::_capnpPrivate::brand }; 156 return { 17, listDepth, T::_capnpPrivate::brand() };
343 } 157 }
344 }; 158 };
345 159
346 template <> 160 template <>
347 struct BrandBindingFor_<AnyPointer, Kind::OTHER> { 161 struct BrandBindingFor_<AnyPointer, Kind::OTHER> {
495 template <typename T> 309 template <typename T>
496 inline constexpr uint sizeInWords() { 310 inline constexpr uint sizeInWords() {
497 // Return the size, in words, of a Struct type, if allocated free-standing (not in a list). 311 // Return the size, in words, of a Struct type, if allocated free-standing (not in a list).
498 // May be useful for pre-computing space needed in order to precisely allocate messages. 312 // May be useful for pre-computing space needed in order to precisely allocate messages.
499 313
500 return (WordCount32(_::structSize<T>().data) + 314 return unbound((upgradeBound<uint>(_::structSize<T>().data) +
501 _::structSize<T>().pointers * WORDS_PER_POINTER) / WORDS; 315 _::structSize<T>().pointers * WORDS_PER_POINTER) / WORDS);
502 } 316 }
503 317
504 } // namespace capnp 318 } // namespace capnp
505 319
506 #if _MSC_VER 320 #if _MSC_VER
510 #define CAPNP_NON_INT_CONSTEXPR_DECL_INIT(value) 324 #define CAPNP_NON_INT_CONSTEXPR_DECL_INIT(value)
511 #define CAPNP_NON_INT_CONSTEXPR_DEF_INIT(value) = value 325 #define CAPNP_NON_INT_CONSTEXPR_DEF_INIT(value) = value
512 #else 326 #else
513 #define CAPNP_NON_INT_CONSTEXPR_DECL_INIT(value) = value 327 #define CAPNP_NON_INT_CONSTEXPR_DECL_INIT(value) = value
514 #define CAPNP_NON_INT_CONSTEXPR_DEF_INIT(value) 328 #define CAPNP_NON_INT_CONSTEXPR_DEF_INIT(value)
329 #endif
330
331 #if _MSC_VER
332 // TODO(msvc): A little hack to allow MSVC to use C++14 return type deduction in cases where the
333 // explicit type exposes bugs in the compiler.
334 #define CAPNP_AUTO_IF_MSVC(...) auto
335 #else
336 #define CAPNP_AUTO_IF_MSVC(...) __VA_ARGS__
515 #endif 337 #endif
516 338
517 #if CAPNP_LITE 339 #if CAPNP_LITE
518 340
519 #define CAPNP_DECLARE_SCHEMA(id) \ 341 #define CAPNP_DECLARE_SCHEMA(id) \