Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
C
capnproto
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
capnproto
Commits
58d8f75c
Commit
58d8f75c
authored
Sep 24, 2013
by
Kenton Varda
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Refactor PointerHelpers to operate on PointerReader/PointerBuilder.
parent
76bda20e
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
239 additions
and
283 deletions
+239
-283
capnpc-c++.c++
c++/src/capnp/compiler/capnpc-c++.c++
+21
-17
grammar.capnp.h
c++/src/capnp/compiler/grammar.capnp.h
+0
-0
lexer.capnp.h
c++/src/capnp/compiler/lexer.capnp.h
+0
-0
dynamic.c++
c++/src/capnp/dynamic.c++
+24
-27
dynamic.h
c++/src/capnp/dynamic.h
+23
-37
generated-header-support.h
c++/src/capnp/generated-header-support.h
+1
-101
list.h
c++/src/capnp/list.h
+34
-101
pointer-helpers.h
c++/src/capnp/pointer-helpers.h
+136
-0
schema.capnp.h
c++/src/capnp/schema.capnp.h
+0
-0
No files found.
c++/src/capnp/compiler/capnpc-c++.c++
View file @
58d8f75c
...
@@ -848,55 +848,59 @@ private:
...
@@ -848,55 +848,59 @@ private:
"inline typename T::Reader "
,
scope
,
"Reader::get"
,
titleCase
,
"() const {
\n
"
,
"inline typename T::Reader "
,
scope
,
"Reader::get"
,
titleCase
,
"() const {
\n
"
,
unionDiscrim
.
check
,
unionDiscrim
.
check
,
" return ::capnp::_::PointerHelpers<T>::get(
\n
"
" return ::capnp::_::PointerHelpers<T>::get(
\n
"
" _reader
, "
,
offset
,
" * ::capnp::POINTERS
);
\n
"
" _reader
.getPointerField("
,
offset
,
" * ::capnp::POINTERS)
);
\n
"
"}
\n
"
"}
\n
"
"template <typename T>
\n
"
"template <typename T>
\n
"
"inline typename T::Builder "
,
scope
,
"Builder::get"
,
titleCase
,
"() {
\n
"
,
"inline typename T::Builder "
,
scope
,
"Builder::get"
,
titleCase
,
"() {
\n
"
,
unionDiscrim
.
check
,
unionDiscrim
.
check
,
" return ::capnp::_::PointerHelpers<T>::get(
\n
"
" return ::capnp::_::PointerHelpers<T>::get(
\n
"
" _builder
, "
,
offset
,
" * ::capnp::POINTERS
);
\n
"
" _builder
.getPointerField("
,
offset
,
" * ::capnp::POINTERS)
);
\n
"
"}
\n
"
"}
\n
"
"template <typename T, typename Param>
\n
"
"template <typename T, typename Param>
\n
"
"inline typename T::Reader "
,
scope
,
"Reader::get"
,
titleCase
,
"(Param&& param) const {
\n
"
,
"inline typename T::Reader "
,
scope
,
"Reader::get"
,
titleCase
,
"(Param&& param) const {
\n
"
,
unionDiscrim
.
check
,
unionDiscrim
.
check
,
" return ::capnp::_::PointerHelpers<T>::getDynamic(
\n
"
" return ::capnp::_::PointerHelpers<T>::getDynamic(
\n
"
" _reader, "
,
offset
,
" * ::capnp::POINTERS, ::kj::fwd<Param>(param));
\n
"
" _reader.getPointerField("
,
offset
,
" * ::capnp::POINTERS),
\n
"
" ::kj::fwd<Param>(param));
\n
"
"}
\n
"
"}
\n
"
"template <typename T, typename Param>
\n
"
"template <typename T, typename Param>
\n
"
"inline typename T::Builder "
,
scope
,
"Builder::get"
,
titleCase
,
"(Param&& param) {
\n
"
,
"inline typename T::Builder "
,
scope
,
"Builder::get"
,
titleCase
,
"(Param&& param) {
\n
"
,
unionDiscrim
.
check
,
unionDiscrim
.
check
,
" return ::capnp::_::PointerHelpers<T>::getDynamic(
\n
"
" return ::capnp::_::PointerHelpers<T>::getDynamic(
\n
"
" _builder, "
,
offset
,
" * ::capnp::POINTERS, ::kj::fwd<Param>(param));
\n
"
" _builder.getPointerField("
,
offset
,
" * ::capnp::POINTERS),
\n
"
" ::kj::fwd<Param>(param));
\n
"
"}
\n
"
"}
\n
"
"template <typename T>
\n
"
"template <typename T>
\n
"
"inline void "
,
scope
,
"Builder::set"
,
titleCase
,
"(typename T::Reader value) {
\n
"
,
"inline void "
,
scope
,
"Builder::set"
,
titleCase
,
"(typename T::Reader value) {
\n
"
,
unionDiscrim
.
set
,
unionDiscrim
.
set
,
" ::capnp::_::PointerHelpers<T>::set(
\n
"
" ::capnp::_::PointerHelpers<T>::set(
\n
"
" _builder
, "
,
offset
,
" * ::capnp::POINTERS
, value);
\n
"
" _builder
.getPointerField("
,
offset
,
" * ::capnp::POINTERS)
, value);
\n
"
"}
\n
"
"}
\n
"
"template <typename T, typename U>"
"template <typename T, typename U>"
"inline void "
,
scope
,
"Builder::set"
,
titleCase
,
"(std::initializer_list<U> value) {
\n
"
,
"inline void "
,
scope
,
"Builder::set"
,
titleCase
,
"(std::initializer_list<U> value) {
\n
"
,
unionDiscrim
.
set
,
unionDiscrim
.
set
,
" ::capnp::_::PointerHelpers<T>::set(
\n
"
" ::capnp::_::PointerHelpers<T>::set(
\n
"
" _builder
, "
,
offset
,
" * ::capnp::POINTERS
, value);
\n
"
" _builder
.getPointerField("
,
offset
,
" * ::capnp::POINTERS)
, value);
\n
"
"}
\n
"
"}
\n
"
"template <typename T, typename... Params>
\n
"
"template <typename T, typename... Params>
\n
"
"inline typename T::Builder "
,
scope
,
"Builder::init"
,
titleCase
,
"(Params&&... params) {
\n
"
,
"inline typename T::Builder "
,
scope
,
"Builder::init"
,
titleCase
,
"(Params&&... params) {
\n
"
,
unionDiscrim
.
set
,
unionDiscrim
.
set
,
" return ::capnp::_::PointerHelpers<T>::init(
\n
"
" return ::capnp::_::PointerHelpers<T>::init(
\n
"
" _builder, "
,
offset
,
" * ::capnp::POINTERS, ::kj::fwd<Params>(params)...);
\n
"
" _builder.getPointerField("
,
offset
,
" * ::capnp::POINTERS),
\n
"
" ::kj::fwd<Params>(params)...);
\n
"
"}
\n
"
"}
\n
"
"template <typename T>
\n
"
"template <typename T>
\n
"
"inline void "
,
scope
,
"Builder::adopt"
,
titleCase
,
"(::capnp::Orphan<T>&& value) {
\n
"
,
"inline void "
,
scope
,
"Builder::adopt"
,
titleCase
,
"(::capnp::Orphan<T>&& value) {
\n
"
,
unionDiscrim
.
set
,
unionDiscrim
.
set
,
" ::capnp::_::PointerHelpers<T>::adopt(
\n
"
" ::capnp::_::PointerHelpers<T>::adopt(
\n
"
" _builder
, "
,
offset
,
" * ::capnp::POINTERS
, kj::mv(value));
\n
"
" _builder
.getPointerField("
,
offset
,
" * ::capnp::POINTERS)
, kj::mv(value));
\n
"
"}
\n
"
"}
\n
"
"template <typename T, typename... Params>
\n
"
"template <typename T, typename... Params>
\n
"
"inline ::capnp::Orphan<T> "
,
scope
,
"Builder::disown"
,
titleCase
,
"(Params&&... params) {
\n
"
,
"inline ::capnp::Orphan<T> "
,
scope
,
"Builder::disown"
,
titleCase
,
"(Params&&... params) {
\n
"
,
unionDiscrim
.
check
,
unionDiscrim
.
check
,
" return ::capnp::_::PointerHelpers<T>::disown(
\n
"
" return ::capnp::_::PointerHelpers<T>::disown(
\n
"
" _builder, "
,
offset
,
" * ::capnp::POINTERS, ::kj::fwd<Params>(params)...);
\n
"
" _builder.getPointerField("
,
offset
,
" * ::capnp::POINTERS),
\n
"
" ::kj::fwd<Params>(params)...);
\n
"
"}
\n
"
"}
\n
"
"
\n
"
)
"
\n
"
)
};
};
...
@@ -986,24 +990,24 @@ private:
...
@@ -986,24 +990,24 @@ private:
"inline "
,
type
,
"::Reader "
,
scope
,
"Reader::get"
,
titleCase
,
"() const {
\n
"
,
"inline "
,
type
,
"::Reader "
,
scope
,
"Reader::get"
,
titleCase
,
"() const {
\n
"
,
unionDiscrim
.
check
,
unionDiscrim
.
check
,
" return ::capnp::_::PointerHelpers<"
,
type
,
">::get(
\n
"
" return ::capnp::_::PointerHelpers<"
,
type
,
">::get(
\n
"
" _reader
, "
,
offset
,
" * ::capnp::POINTERS
"
,
defaultParam
,
");
\n
"
" _reader
.getPointerField("
,
offset
,
" * ::capnp::POINTERS)
"
,
defaultParam
,
");
\n
"
"}
\n
"
"}
\n
"
"inline "
,
type
,
"::Builder "
,
scope
,
"Builder::get"
,
titleCase
,
"() {
\n
"
,
"inline "
,
type
,
"::Builder "
,
scope
,
"Builder::get"
,
titleCase
,
"() {
\n
"
,
unionDiscrim
.
check
,
unionDiscrim
.
check
,
" return ::capnp::_::PointerHelpers<"
,
type
,
">::get(
\n
"
" return ::capnp::_::PointerHelpers<"
,
type
,
">::get(
\n
"
" _builder
, "
,
offset
,
" * ::capnp::POINTERS
"
,
defaultParam
,
");
\n
"
" _builder
.getPointerField("
,
offset
,
" * ::capnp::POINTERS)
"
,
defaultParam
,
");
\n
"
"}
\n
"
"}
\n
"
"inline void "
,
scope
,
"Builder::set"
,
titleCase
,
"("
,
type
,
"::Reader value) {
\n
"
,
"inline void "
,
scope
,
"Builder::set"
,
titleCase
,
"("
,
type
,
"::Reader value) {
\n
"
,
unionDiscrim
.
set
,
unionDiscrim
.
set
,
" ::capnp::_::PointerHelpers<"
,
type
,
">::set(
\n
"
" ::capnp::_::PointerHelpers<"
,
type
,
">::set(
\n
"
" _builder
, "
,
offset
,
" * ::capnp::POINTERS
, value);
\n
"
" _builder
.getPointerField("
,
offset
,
" * ::capnp::POINTERS)
, value);
\n
"
"}
\n
"
,
"}
\n
"
,
kind
==
FieldKind
::
LIST
&&
!
isStructList
kind
==
FieldKind
::
LIST
&&
!
isStructList
?
kj
::
strTree
(
?
kj
::
strTree
(
"inline void "
,
scope
,
"Builder::set"
,
titleCase
,
"(std::initializer_list<"
,
elementReaderType
,
"> value) {
\n
"
,
"inline void "
,
scope
,
"Builder::set"
,
titleCase
,
"(std::initializer_list<"
,
elementReaderType
,
"> value) {
\n
"
,
unionDiscrim
.
set
,
unionDiscrim
.
set
,
" ::capnp::_::PointerHelpers<"
,
type
,
">::set(
\n
"
" ::capnp::_::PointerHelpers<"
,
type
,
">::set(
\n
"
" _builder
, "
,
offset
,
" * ::capnp::POINTERS
, value);
\n
"
" _builder
.getPointerField("
,
offset
,
" * ::capnp::POINTERS)
, value);
\n
"
"}
\n
"
)
"}
\n
"
)
:
kj
::
strTree
(),
:
kj
::
strTree
(),
kind
==
FieldKind
::
STRUCT
kind
==
FieldKind
::
STRUCT
...
@@ -1011,24 +1015,24 @@ private:
...
@@ -1011,24 +1015,24 @@ private:
"inline "
,
type
,
"::Builder "
,
scope
,
"Builder::init"
,
titleCase
,
"() {
\n
"
,
"inline "
,
type
,
"::Builder "
,
scope
,
"Builder::init"
,
titleCase
,
"() {
\n
"
,
unionDiscrim
.
set
,
unionDiscrim
.
set
,
" return ::capnp::_::PointerHelpers<"
,
type
,
">::init(
\n
"
" return ::capnp::_::PointerHelpers<"
,
type
,
">::init(
\n
"
" _builder
, "
,
offset
,
" * ::capnp::POINTERS
);
\n
"
" _builder
.getPointerField("
,
offset
,
" * ::capnp::POINTERS)
);
\n
"
"}
\n
"
)
"}
\n
"
)
:
kj
::
strTree
(
:
kj
::
strTree
(
"inline "
,
type
,
"::Builder "
,
scope
,
"Builder::init"
,
titleCase
,
"(unsigned int size) {
\n
"
,
"inline "
,
type
,
"::Builder "
,
scope
,
"Builder::init"
,
titleCase
,
"(unsigned int size) {
\n
"
,
unionDiscrim
.
set
,
unionDiscrim
.
set
,
" return ::capnp::_::PointerHelpers<"
,
type
,
">::init(
\n
"
" return ::capnp::_::PointerHelpers<"
,
type
,
">::init(
\n
"
" _builder
, "
,
offset
,
" * ::capnp::POINTERS
, size);
\n
"
" _builder
.getPointerField("
,
offset
,
" * ::capnp::POINTERS)
, size);
\n
"
"}
\n
"
),
"}
\n
"
),
"inline void "
,
scope
,
"Builder::adopt"
,
titleCase
,
"(
\n
"
"inline void "
,
scope
,
"Builder::adopt"
,
titleCase
,
"(
\n
"
" ::capnp::Orphan<"
,
type
,
">&& value) {
\n
"
,
" ::capnp::Orphan<"
,
type
,
">&& value) {
\n
"
,
unionDiscrim
.
set
,
unionDiscrim
.
set
,
" ::capnp::_::PointerHelpers<"
,
type
,
">::adopt(
\n
"
" ::capnp::_::PointerHelpers<"
,
type
,
">::adopt(
\n
"
" _builder
, "
,
offset
,
" * ::capnp::POINTERS
, kj::mv(value));
\n
"
" _builder
.getPointerField("
,
offset
,
" * ::capnp::POINTERS)
, kj::mv(value));
\n
"
"}
\n
"
"}
\n
"
"inline ::capnp::Orphan<"
,
type
,
"> "
,
scope
,
"Builder::disown"
,
titleCase
,
"() {
\n
"
,
"inline ::capnp::Orphan<"
,
type
,
"> "
,
scope
,
"Builder::disown"
,
titleCase
,
"() {
\n
"
,
unionDiscrim
.
check
,
unionDiscrim
.
check
,
" return ::capnp::_::PointerHelpers<"
,
type
,
">::disown(
\n
"
" return ::capnp::_::PointerHelpers<"
,
type
,
">::disown(
\n
"
" _builder
, "
,
offset
,
" * ::capnp::POINTERS
);
\n
"
" _builder
.getPointerField("
,
offset
,
" * ::capnp::POINTERS)
);
\n
"
"}
\n
"
"}
\n
"
"
\n
"
)
"
\n
"
)
};
};
...
...
c++/src/capnp/compiler/grammar.capnp.h
View file @
58d8f75c
This diff is collapsed.
Click to expand it.
c++/src/capnp/compiler/lexer.capnp.h
View file @
58d8f75c
This diff is collapsed.
Click to expand it.
c++/src/capnp/dynamic.c++
View file @
58d8f75c
...
@@ -1700,77 +1700,74 @@ void MessageBuilder::setRoot<DynamicStruct::Reader&>(DynamicStruct::Reader& valu
...
@@ -1700,77 +1700,74 @@ void MessageBuilder::setRoot<DynamicStruct::Reader&>(DynamicStruct::Reader& valu
namespace
_
{
// private
namespace
_
{
// private
DynamicStruct
::
Reader
PointerHelpers
<
DynamicStruct
,
Kind
::
UNKNOWN
>::
getDynamic
(
DynamicStruct
::
Reader
PointerHelpers
<
DynamicStruct
,
Kind
::
UNKNOWN
>::
getDynamic
(
StructReader
reader
,
WirePointerCount
index
,
StructSchema
schema
)
{
PointerReader
reader
,
StructSchema
schema
)
{
KJ_REQUIRE
(
!
schema
.
getProto
().
getStruct
().
getIsGroup
(),
KJ_REQUIRE
(
!
schema
.
getProto
().
getStruct
().
getIsGroup
(),
"Cannot form pointer to group type."
);
"Cannot form pointer to group type."
);
return
DynamicStruct
::
Reader
(
schema
,
reader
.
get
PointerField
(
index
).
get
Struct
(
nullptr
));
return
DynamicStruct
::
Reader
(
schema
,
reader
.
getStruct
(
nullptr
));
}
}
DynamicStruct
::
Builder
PointerHelpers
<
DynamicStruct
,
Kind
::
UNKNOWN
>::
getDynamic
(
DynamicStruct
::
Builder
PointerHelpers
<
DynamicStruct
,
Kind
::
UNKNOWN
>::
getDynamic
(
StructBuilder
builder
,
WirePointerCount
index
,
StructSchema
schema
)
{
PointerBuilder
builder
,
StructSchema
schema
)
{
KJ_REQUIRE
(
!
schema
.
getProto
().
getStruct
().
getIsGroup
(),
KJ_REQUIRE
(
!
schema
.
getProto
().
getStruct
().
getIsGroup
(),
"Cannot form pointer to group type."
);
"Cannot form pointer to group type."
);
return
DynamicStruct
::
Builder
(
schema
,
builder
.
get
PointerField
(
index
).
get
Struct
(
return
DynamicStruct
::
Builder
(
schema
,
builder
.
getStruct
(
structSizeFromSchema
(
schema
),
nullptr
));
structSizeFromSchema
(
schema
),
nullptr
));
}
}
void
PointerHelpers
<
DynamicStruct
,
Kind
::
UNKNOWN
>::
set
(
void
PointerHelpers
<
DynamicStruct
,
Kind
::
UNKNOWN
>::
set
(
StructBuilder
builder
,
WirePointerCount
index
,
const
DynamicStruct
::
Reader
&
value
)
{
PointerBuilder
builder
,
const
DynamicStruct
::
Reader
&
value
)
{
KJ_REQUIRE
(
!
value
.
schema
.
getProto
().
getStruct
().
getIsGroup
(),
KJ_REQUIRE
(
!
value
.
schema
.
getProto
().
getStruct
().
getIsGroup
(),
"Cannot form pointer to group type."
);
"Cannot form pointer to group type."
);
builder
.
getPointerField
(
index
).
setStruct
(
value
.
reader
);
builder
.
setStruct
(
value
.
reader
);
}
}
DynamicStruct
::
Builder
PointerHelpers
<
DynamicStruct
,
Kind
::
UNKNOWN
>::
init
(
DynamicStruct
::
Builder
PointerHelpers
<
DynamicStruct
,
Kind
::
UNKNOWN
>::
init
(
StructBuilder
builder
,
WirePointerCount
index
,
StructSchema
schema
)
{
PointerBuilder
builder
,
StructSchema
schema
)
{
KJ_REQUIRE
(
!
schema
.
getProto
().
getStruct
().
getIsGroup
(),
KJ_REQUIRE
(
!
schema
.
getProto
().
getStruct
().
getIsGroup
(),
"Cannot form pointer to group type."
);
"Cannot form pointer to group type."
);
return
DynamicStruct
::
Builder
(
schema
,
return
DynamicStruct
::
Builder
(
schema
,
builder
.
getPointerField
(
index
).
initStruct
(
structSizeFromSchema
(
schema
)));
builder
.
initStruct
(
structSizeFromSchema
(
schema
)));
}
}
DynamicList
::
Reader
PointerHelpers
<
DynamicList
,
Kind
::
UNKNOWN
>::
getDynamic
(
DynamicList
::
Reader
PointerHelpers
<
DynamicList
,
Kind
::
UNKNOWN
>::
getDynamic
(
StructReader
reader
,
WirePointerCount
index
,
ListSchema
schema
)
{
PointerReader
reader
,
ListSchema
schema
)
{
return
DynamicList
::
Reader
(
schema
,
return
DynamicList
::
Reader
(
schema
,
reader
.
get
PointerField
(
index
).
get
List
(
elementSizeFor
(
schema
.
whichElementType
()),
nullptr
));
reader
.
getList
(
elementSizeFor
(
schema
.
whichElementType
()),
nullptr
));
}
}
DynamicList
::
Builder
PointerHelpers
<
DynamicList
,
Kind
::
UNKNOWN
>::
getDynamic
(
DynamicList
::
Builder
PointerHelpers
<
DynamicList
,
Kind
::
UNKNOWN
>::
getDynamic
(
StructBuilder
builder
,
WirePointerCount
index
,
ListSchema
schema
)
{
PointerBuilder
builder
,
ListSchema
schema
)
{
if
(
schema
.
whichElementType
()
==
schema
::
Type
::
STRUCT
)
{
if
(
schema
.
whichElementType
()
==
schema
::
Type
::
STRUCT
)
{
return
DynamicList
::
Builder
(
schema
,
return
DynamicList
::
Builder
(
schema
,
builder
.
get
PointerField
(
index
).
get
StructList
(
builder
.
getStructList
(
structSizeFromSchema
(
schema
.
getStructElementType
()),
structSizeFromSchema
(
schema
.
getStructElementType
()),
nullptr
));
nullptr
));
}
else
{
}
else
{
return
DynamicList
::
Builder
(
schema
,
return
DynamicList
::
Builder
(
schema
,
builder
.
get
PointerField
(
index
).
get
List
(
elementSizeFor
(
schema
.
whichElementType
()),
nullptr
));
builder
.
getList
(
elementSizeFor
(
schema
.
whichElementType
()),
nullptr
));
}
}
}
}
void
PointerHelpers
<
DynamicList
,
Kind
::
UNKNOWN
>::
set
(
void
PointerHelpers
<
DynamicList
,
Kind
::
UNKNOWN
>::
set
(
StructBuilder
builder
,
WirePointerCount
index
,
const
DynamicList
::
Reader
&
value
)
{
PointerBuilder
builder
,
const
DynamicList
::
Reader
&
value
)
{
builder
.
getPointerField
(
index
).
setList
(
value
.
reader
);
builder
.
setList
(
value
.
reader
);
}
}
DynamicList
::
Builder
PointerHelpers
<
DynamicList
,
Kind
::
UNKNOWN
>::
init
(
DynamicList
::
Builder
PointerHelpers
<
DynamicList
,
Kind
::
UNKNOWN
>::
init
(
StructBuilder
builder
,
WirePointerCount
index
,
ListSchema
schema
,
uint
size
)
{
PointerBuilder
builder
,
ListSchema
schema
,
uint
size
)
{
if
(
schema
.
whichElementType
()
==
schema
::
Type
::
STRUCT
)
{
if
(
schema
.
whichElementType
()
==
schema
::
Type
::
STRUCT
)
{
return
DynamicList
::
Builder
(
schema
,
return
DynamicList
::
Builder
(
schema
,
builder
.
getPointerField
(
index
).
initStructList
(
size
*
ELEMENTS
,
builder
.
initStructList
(
size
*
ELEMENTS
,
structSizeFromSchema
(
schema
.
getStructElementType
())));
structSizeFromSchema
(
schema
.
getStructElementType
())));
}
else
{
}
else
{
return
DynamicList
::
Builder
(
schema
,
return
DynamicList
::
Builder
(
schema
,
builder
.
getPointerField
(
index
)
builder
.
initList
(
elementSizeFor
(
schema
.
whichElementType
()),
size
*
ELEMENTS
));
.
initList
(
elementSizeFor
(
schema
.
whichElementType
()),
size
*
ELEMENTS
));
}
}
}
}
DynamicObject
::
Reader
PointerHelpers
<
DynamicObject
,
Kind
::
UNKNOWN
>::
get
(
DynamicObject
::
Reader
PointerHelpers
<
DynamicObject
,
Kind
::
UNKNOWN
>::
get
(
PointerReader
reader
)
{
StructReader
reader
,
WirePointerCount
index
)
{
return
DynamicObject
::
Reader
(
reader
.
getObject
(
nullptr
));
return
DynamicObject
::
Reader
(
reader
.
getPointerField
(
index
).
getObject
(
nullptr
));
}
}
DynamicObject
::
Builder
PointerHelpers
<
DynamicObject
,
Kind
::
UNKNOWN
>::
get
(
DynamicObject
::
Builder
PointerHelpers
<
DynamicObject
,
Kind
::
UNKNOWN
>::
get
(
PointerBuilder
builder
)
{
StructBuilder
builder
,
WirePointerCount
index
)
{
return
DynamicObject
::
Builder
(
builder
.
getObject
(
nullptr
));
return
DynamicObject
::
Builder
(
builder
.
getPointerField
(
index
).
getObject
(
nullptr
));
}
}
void
PointerHelpers
<
DynamicObject
,
Kind
::
UNKNOWN
>::
set
(
void
PointerHelpers
<
DynamicObject
,
Kind
::
UNKNOWN
>::
set
(
StructBuilder
builder
,
WirePointerCount
index
,
const
DynamicObject
::
Reader
&
value
)
{
PointerBuilder
builder
,
const
DynamicObject
::
Reader
&
value
)
{
builder
.
getPointerField
(
index
).
setObject
(
value
.
reader
);
builder
.
setObject
(
value
.
reader
);
}
}
}
// namespace _ (private)
}
// namespace _ (private)
...
...
c++/src/capnp/dynamic.h
View file @
58d8f75c
...
@@ -954,21 +954,15 @@ struct PointerHelpers<DynamicStruct, Kind::UNKNOWN> {
...
@@ -954,21 +954,15 @@ struct PointerHelpers<DynamicStruct, Kind::UNKNOWN> {
// getDynamic() is used when an Object's get() accessor is passed arguments, because for
// getDynamic() is used when an Object's get() accessor is passed arguments, because for
// non-dynamic types PointerHelpers::get() takes a default value as the third argument, and we
// non-dynamic types PointerHelpers::get() takes a default value as the third argument, and we
// don't want people to accidentally be able to provide their own default value.
// don't want people to accidentally be able to provide their own default value.
static
DynamicStruct
::
Reader
getDynamic
(
static
DynamicStruct
::
Reader
getDynamic
(
PointerReader
reader
,
StructSchema
schema
);
StructReader
reader
,
WirePointerCount
index
,
StructSchema
schema
);
static
DynamicStruct
::
Builder
getDynamic
(
PointerBuilder
builder
,
StructSchema
schema
);
static
DynamicStruct
::
Builder
getDynamic
(
static
void
set
(
PointerBuilder
builder
,
const
DynamicStruct
::
Reader
&
value
);
StructBuilder
builder
,
WirePointerCount
index
,
StructSchema
schema
);
static
DynamicStruct
::
Builder
init
(
PointerBuilder
builder
,
StructSchema
schema
);
static
void
set
(
static
inline
void
adopt
(
PointerBuilder
builder
,
Orphan
<
DynamicStruct
>&&
value
)
{
StructBuilder
builder
,
WirePointerCount
index
,
const
DynamicStruct
::
Reader
&
value
);
builder
.
adopt
(
kj
::
mv
(
value
.
builder
));
static
DynamicStruct
::
Builder
init
(
StructBuilder
builder
,
WirePointerCount
index
,
StructSchema
schema
);
static
inline
void
adopt
(
StructBuilder
builder
,
WirePointerCount
index
,
Orphan
<
DynamicStruct
>&&
value
)
{
builder
.
getPointerField
(
index
).
adopt
(
kj
::
mv
(
value
.
builder
));
}
}
static
inline
Orphan
<
DynamicStruct
>
disown
(
StructBuilder
builder
,
WirePointerCount
index
,
static
inline
Orphan
<
DynamicStruct
>
disown
(
PointerBuilder
builder
,
StructSchema
schema
)
{
StructSchema
schema
)
{
return
Orphan
<
DynamicStruct
>
(
schema
,
builder
.
disown
());
return
Orphan
<
DynamicStruct
>
(
schema
,
builder
.
getPointerField
(
index
).
disown
());
}
}
};
};
...
@@ -977,36 +971,28 @@ struct PointerHelpers<DynamicList, Kind::UNKNOWN> {
...
@@ -977,36 +971,28 @@ struct PointerHelpers<DynamicList, Kind::UNKNOWN> {
// getDynamic() is used when an Object's get() accessor is passed arguments, because for
// getDynamic() is used when an Object's get() accessor is passed arguments, because for
// non-dynamic types PointerHelpers::get() takes a default value as the third argument, and we
// non-dynamic types PointerHelpers::get() takes a default value as the third argument, and we
// don't want people to accidentally be able to provide their own default value.
// don't want people to accidentally be able to provide their own default value.
static
DynamicList
::
Reader
getDynamic
(
static
DynamicList
::
Reader
getDynamic
(
PointerReader
reader
,
ListSchema
schema
);
StructReader
reader
,
WirePointerCount
index
,
ListSchema
schema
);
static
DynamicList
::
Builder
getDynamic
(
PointerBuilder
builder
,
ListSchema
schema
);
static
DynamicList
::
Builder
getDynamic
(
static
void
set
(
PointerBuilder
builder
,
const
DynamicList
::
Reader
&
value
);
StructBuilder
builder
,
WirePointerCount
index
,
ListSchema
schema
);
static
DynamicList
::
Builder
init
(
PointerBuilder
builder
,
ListSchema
schema
,
uint
size
);
static
void
set
(
static
inline
void
adopt
(
PointerBuilder
builder
,
Orphan
<
DynamicList
>&&
value
)
{
StructBuilder
builder
,
WirePointerCount
index
,
const
DynamicList
::
Reader
&
value
);
builder
.
adopt
(
kj
::
mv
(
value
.
builder
));
static
DynamicList
::
Builder
init
(
StructBuilder
builder
,
WirePointerCount
index
,
ListSchema
schema
,
uint
size
);
static
inline
void
adopt
(
StructBuilder
builder
,
WirePointerCount
index
,
Orphan
<
DynamicList
>&&
value
)
{
builder
.
getPointerField
(
index
).
adopt
(
kj
::
mv
(
value
.
builder
));
}
}
static
inline
Orphan
<
DynamicList
>
disown
(
StructBuilder
builder
,
WirePointerCount
index
,
static
inline
Orphan
<
DynamicList
>
disown
(
PointerBuilder
builder
,
ListSchema
schema
)
{
ListSchema
schema
)
{
return
Orphan
<
DynamicList
>
(
schema
,
builder
.
disown
());
return
Orphan
<
DynamicList
>
(
schema
,
builder
.
getPointerField
(
index
).
disown
());
}
}
};
};
template
<>
template
<>
struct
PointerHelpers
<
DynamicObject
,
Kind
::
UNKNOWN
>
{
struct
PointerHelpers
<
DynamicObject
,
Kind
::
UNKNOWN
>
{
static
DynamicObject
::
Reader
get
(
StructReader
reader
,
WirePointerCount
index
);
static
DynamicObject
::
Reader
get
(
PointerReader
reader
);
static
DynamicObject
::
Builder
get
(
StructBuilder
builder
,
WirePointerCount
index
);
static
DynamicObject
::
Builder
get
(
PointerBuilder
builder
);
static
void
set
(
static
void
set
(
PointerBuilder
builder
,
const
DynamicObject
::
Reader
&
value
);
StructBuilder
builder
,
WirePointerCount
index
,
const
DynamicObject
::
Reader
&
value
);
static
inline
void
adopt
(
PointerBuilder
builder
,
Orphan
<
DynamicObject
>&&
value
)
{
static
inline
void
adopt
(
StructBuilder
builder
,
WirePointerCount
index
,
builder
.
adopt
(
kj
::
mv
(
value
.
builder
));
Orphan
<
DynamicObject
>&&
value
)
{
builder
.
getPointerField
(
index
).
adopt
(
kj
::
mv
(
value
.
builder
));
}
}
static
inline
Orphan
<
DynamicObject
>
disown
(
StructBuilder
builder
,
WirePointerCount
index
)
{
static
inline
Orphan
<
DynamicObject
>
disown
(
PointerBuilder
builder
)
{
return
Orphan
<
DynamicObject
>
(
builder
.
getPointerField
(
index
).
disown
());
return
Orphan
<
DynamicObject
>
(
builder
.
disown
());
}
}
};
};
...
...
c++/src/capnp/generated-header-support.h
View file @
58d8f75c
...
@@ -29,6 +29,7 @@
...
@@ -29,6 +29,7 @@
#include "layout.h"
#include "layout.h"
#include "list.h"
#include "list.h"
#include "orphan.h"
#include "orphan.h"
#include "pointer-helpers.h"
#include <kj/string.h>
#include <kj/string.h>
#include <kj/string-tree.h>
#include <kj/string-tree.h>
...
@@ -43,107 +44,6 @@ struct DynamicStruct; // So that it can be declared a friend.
...
@@ -43,107 +44,6 @@ struct DynamicStruct; // So that it can be declared a friend.
namespace
_
{
// private
namespace
_
{
// private
template
<
typename
T
>
struct
PointerHelpers
<
T
,
Kind
::
STRUCT
>
{
static
inline
typename
T
::
Reader
get
(
StructReader
reader
,
WirePointerCount
index
,
const
word
*
defaultValue
=
nullptr
)
{
return
typename
T
::
Reader
(
reader
.
getPointerField
(
index
).
getStruct
(
defaultValue
));
}
static
inline
typename
T
::
Builder
get
(
StructBuilder
builder
,
WirePointerCount
index
,
const
word
*
defaultValue
=
nullptr
)
{
return
typename
T
::
Builder
(
builder
.
getPointerField
(
index
).
getStruct
(
structSize
<
T
>
(),
defaultValue
));
}
static
inline
void
set
(
StructBuilder
builder
,
WirePointerCount
index
,
typename
T
::
Reader
value
)
{
builder
.
getPointerField
(
index
).
setStruct
(
value
.
_reader
);
}
static
inline
typename
T
::
Builder
init
(
StructBuilder
builder
,
WirePointerCount
index
)
{
return
typename
T
::
Builder
(
builder
.
getPointerField
(
index
).
initStruct
(
structSize
<
T
>
()));
}
static
inline
void
adopt
(
StructBuilder
builder
,
WirePointerCount
index
,
Orphan
<
T
>&&
value
)
{
builder
.
getPointerField
(
index
).
adopt
(
kj
::
mv
(
value
.
builder
));
}
static
inline
Orphan
<
T
>
disown
(
StructBuilder
builder
,
WirePointerCount
index
)
{
return
Orphan
<
T
>
(
builder
.
getPointerField
(
index
).
disown
());
}
};
template
<
typename
T
>
struct
PointerHelpers
<
List
<
T
>
,
Kind
::
LIST
>
{
static
inline
typename
List
<
T
>::
Reader
get
(
StructReader
reader
,
WirePointerCount
index
,
const
word
*
defaultValue
=
nullptr
)
{
return
typename
List
<
T
>::
Reader
(
List
<
T
>::
getAsFieldOf
(
reader
,
index
,
defaultValue
));
}
static
inline
typename
List
<
T
>::
Builder
get
(
StructBuilder
builder
,
WirePointerCount
index
,
const
word
*
defaultValue
=
nullptr
)
{
return
typename
List
<
T
>::
Builder
(
List
<
T
>::
getAsFieldOf
(
builder
,
index
,
defaultValue
));
}
static
inline
void
set
(
StructBuilder
builder
,
WirePointerCount
index
,
typename
List
<
T
>::
Reader
value
)
{
builder
.
getPointerField
(
index
).
setList
(
value
.
reader
);
}
template
<
typename
U
>
static
void
set
(
StructBuilder
builder
,
WirePointerCount
index
,
std
::
initializer_list
<
U
>
value
)
{
auto
l
=
init
(
builder
,
index
,
value
.
size
());
uint
i
=
0
;
for
(
auto
&
element
:
value
)
{
l
.
set
(
i
++
,
element
);
}
}
static
inline
typename
List
<
T
>::
Builder
init
(
StructBuilder
builder
,
WirePointerCount
index
,
uint
size
)
{
return
typename
List
<
T
>::
Builder
(
List
<
T
>::
initAsFieldOf
(
builder
,
index
,
size
));
}
static
inline
void
adopt
(
StructBuilder
builder
,
WirePointerCount
index
,
Orphan
<
List
<
T
>>&&
value
)
{
builder
.
getPointerField
(
index
).
adopt
(
kj
::
mv
(
value
.
builder
));
}
static
inline
Orphan
<
List
<
T
>>
disown
(
StructBuilder
builder
,
WirePointerCount
index
)
{
return
Orphan
<
List
<
T
>>
(
builder
.
getPointerField
(
index
).
disown
());
}
};
template
<
typename
T
>
struct
PointerHelpers
<
T
,
Kind
::
BLOB
>
{
static
inline
typename
T
::
Reader
get
(
StructReader
reader
,
WirePointerCount
index
,
const
void
*
defaultValue
=
nullptr
,
uint
defaultBytes
=
0
)
{
return
reader
.
getPointerField
(
index
).
getBlob
<
T
>
(
defaultValue
,
defaultBytes
*
BYTES
);
}
static
inline
typename
T
::
Builder
get
(
StructBuilder
builder
,
WirePointerCount
index
,
const
void
*
defaultValue
=
nullptr
,
uint
defaultBytes
=
0
)
{
return
builder
.
getPointerField
(
index
).
getBlob
<
T
>
(
defaultValue
,
defaultBytes
*
BYTES
);
}
static
inline
void
set
(
StructBuilder
builder
,
WirePointerCount
index
,
typename
T
::
Reader
value
)
{
builder
.
getPointerField
(
index
).
setBlob
<
T
>
(
value
);
}
static
inline
typename
T
::
Builder
init
(
StructBuilder
builder
,
WirePointerCount
index
,
uint
size
)
{
return
builder
.
getPointerField
(
index
).
initBlob
<
T
>
(
size
*
BYTES
);
}
static
inline
void
adopt
(
StructBuilder
builder
,
WirePointerCount
index
,
Orphan
<
T
>&&
value
)
{
builder
.
getPointerField
(
index
).
adopt
(
kj
::
mv
(
value
.
builder
));
}
static
inline
Orphan
<
T
>
disown
(
StructBuilder
builder
,
WirePointerCount
index
)
{
return
Orphan
<
T
>
(
builder
.
getPointerField
(
index
).
disown
());
}
};
struct
UncheckedMessage
{
typedef
const
word
*
Reader
;
};
template
<>
struct
PointerHelpers
<
UncheckedMessage
>
{
// Reads an Object field as an unchecked message pointer. Requires that the containing message is
// itself unchecked. This hack is currently private. It is used to locate default values within
// encoded schemas.
static
inline
const
word
*
get
(
StructReader
reader
,
WirePointerCount
index
)
{
return
reader
.
getPointerField
(
index
).
getUnchecked
();
}
};
struct
RawSchema
{
struct
RawSchema
{
// The generated code defines a constant RawSchema for every compiled declaration.
// The generated code defines a constant RawSchema for every compiled declaration.
//
//
...
...
c++/src/capnp/list.h
View file @
58d8f75c
...
@@ -168,33 +168,15 @@ struct List<T, Kind::PRIMITIVE> {
...
@@ -168,33 +168,15 @@ struct List<T, Kind::PRIMITIVE> {
};
};
private
:
private
:
inline
static
_
::
ListBuilder
initAsElementOf
(
inline
static
_
::
ListBuilder
initPointer
(
_
::
PointerBuilder
builder
,
uint
size
)
{
_
::
ListBuilder
&
builder
,
uint
index
,
uint
size
)
{
return
builder
.
initList
(
_
::
elementSizeForType
<
T
>
(),
size
*
ELEMENTS
);
return
builder
.
getPointerElement
(
index
*
ELEMENTS
)
.
initList
(
_
::
elementSizeForType
<
T
>
(),
size
*
ELEMENTS
);
}
}
inline
static
_
::
ListBuilder
getAsElementOf
(
inline
static
_
::
ListBuilder
getFromPointer
(
_
::
PointerBuilder
builder
,
const
word
*
defaultValue
)
{
_
::
ListBuilder
&
builder
,
uint
index
)
{
return
builder
.
getList
(
_
::
elementSizeForType
<
T
>
(),
defaultValue
);
return
builder
.
getPointerElement
(
index
*
ELEMENTS
)
.
getList
(
_
::
elementSizeForType
<
T
>
(),
nullptr
);
}
}
inline
static
_
::
ListReader
getAsElementOf
(
inline
static
_
::
ListReader
getFromPointer
(
const
_
::
ListReader
&
reader
,
uint
index
)
{
const
_
::
PointerReader
&
reader
,
const
word
*
defaultValue
)
{
return
reader
.
getPointerElement
(
index
*
ELEMENTS
)
return
reader
.
getList
(
_
::
elementSizeForType
<
T
>
(),
defaultValue
);
.
getList
(
_
::
elementSizeForType
<
T
>
(),
nullptr
);
}
inline
static
_
::
ListBuilder
initAsFieldOf
(
_
::
StructBuilder
&
builder
,
WirePointerCount
index
,
uint
size
)
{
return
builder
.
getPointerField
(
index
).
initList
(
_
::
elementSizeForType
<
T
>
(),
size
*
ELEMENTS
);
}
inline
static
_
::
ListBuilder
getAsFieldOf
(
_
::
StructBuilder
&
builder
,
WirePointerCount
index
,
const
word
*
defaultValue
)
{
return
builder
.
getPointerField
(
index
).
getList
(
_
::
elementSizeForType
<
T
>
(),
defaultValue
);
}
inline
static
_
::
ListReader
getAsFieldOf
(
const
_
::
StructReader
&
reader
,
WirePointerCount
index
,
const
word
*
defaultValue
)
{
return
reader
.
getPointerField
(
index
).
getList
(
_
::
elementSizeForType
<
T
>
(),
defaultValue
);
}
}
template
<
typename
U
,
Kind
k
>
template
<
typename
U
,
Kind
k
>
...
@@ -304,33 +286,15 @@ struct List<T, Kind::STRUCT> {
...
@@ -304,33 +286,15 @@ struct List<T, Kind::STRUCT> {
};
};
private
:
private
:
inline
static
_
::
ListBuilder
initAsElementOf
(
inline
static
_
::
ListBuilder
initPointer
(
_
::
PointerBuilder
builder
,
uint
size
)
{
_
::
ListBuilder
&
builder
,
uint
index
,
uint
size
)
{
return
builder
.
initStructList
(
size
*
ELEMENTS
,
_
::
structSize
<
T
>
());
return
builder
.
getPointerElement
(
index
*
ELEMENTS
)
.
initStructList
(
size
*
ELEMENTS
,
_
::
structSize
<
T
>
());
}
inline
static
_
::
ListBuilder
getAsElementOf
(
_
::
ListBuilder
&
builder
,
uint
index
)
{
return
builder
.
getPointerElement
(
index
*
ELEMENTS
)
.
getStructList
(
_
::
structSize
<
T
>
(),
nullptr
);
}
inline
static
_
::
ListReader
getAsElementOf
(
const
_
::
ListReader
&
reader
,
uint
index
)
{
return
reader
.
getPointerElement
(
index
*
ELEMENTS
)
.
getList
(
_
::
FieldSize
::
INLINE_COMPOSITE
,
nullptr
);
}
inline
static
_
::
ListBuilder
initAsFieldOf
(
_
::
StructBuilder
&
builder
,
WirePointerCount
index
,
uint
size
)
{
return
builder
.
getPointerField
(
index
).
initStructList
(
size
*
ELEMENTS
,
_
::
structSize
<
T
>
());
}
}
inline
static
_
::
ListBuilder
getAsFieldOf
(
inline
static
_
::
ListBuilder
getFromPointer
(
_
::
PointerBuilder
builder
,
const
word
*
defaultValue
)
{
_
::
StructBuilder
&
builder
,
WirePointerCount
index
,
const
word
*
defaultValue
)
{
return
builder
.
getStructList
(
_
::
structSize
<
T
>
(),
defaultValue
);
return
builder
.
getPointerField
(
index
).
getStructList
(
_
::
structSize
<
T
>
(),
defaultValue
);
}
}
inline
static
_
::
ListReader
get
AsFieldOf
(
inline
static
_
::
ListReader
get
FromPointer
(
const
_
::
StructReader
&
reader
,
WirePointerCount
index
,
const
word
*
defaultValue
)
{
const
_
::
PointerReader
&
reader
,
const
word
*
defaultValue
)
{
return
reader
.
get
PointerField
(
index
).
get
List
(
_
::
FieldSize
::
INLINE_COMPOSITE
,
defaultValue
);
return
reader
.
getList
(
_
::
FieldSize
::
INLINE_COMPOSITE
,
defaultValue
);
}
}
template
<
typename
U
,
Kind
k
>
template
<
typename
U
,
Kind
k
>
...
@@ -355,7 +319,8 @@ struct List<List<T>, Kind::LIST> {
...
@@ -355,7 +319,8 @@ struct List<List<T>, Kind::LIST> {
inline
uint
size
()
const
{
return
reader
.
size
()
/
ELEMENTS
;
}
inline
uint
size
()
const
{
return
reader
.
size
()
/
ELEMENTS
;
}
inline
typename
List
<
T
>::
Reader
operator
[](
uint
index
)
const
{
inline
typename
List
<
T
>::
Reader
operator
[](
uint
index
)
const
{
KJ_IREQUIRE
(
index
<
size
());
KJ_IREQUIRE
(
index
<
size
());
return
typename
List
<
T
>::
Reader
(
List
<
T
>::
getAsElementOf
(
reader
,
index
));
return
typename
List
<
T
>::
Reader
(
_
::
PointerHelpers
<
List
<
T
>>::
get
(
reader
.
getPointerElement
(
index
*
ELEMENTS
)));
}
}
typedef
_
::
IndexingIterator
<
const
Reader
,
typename
List
<
T
>::
Reader
>
Iterator
;
typedef
_
::
IndexingIterator
<
const
Reader
,
typename
List
<
T
>::
Reader
>
Iterator
;
...
@@ -387,11 +352,13 @@ struct List<List<T>, Kind::LIST> {
...
@@ -387,11 +352,13 @@ struct List<List<T>, Kind::LIST> {
inline
uint
size
()
const
{
return
builder
.
size
()
/
ELEMENTS
;
}
inline
uint
size
()
const
{
return
builder
.
size
()
/
ELEMENTS
;
}
inline
typename
List
<
T
>::
Builder
operator
[](
uint
index
)
{
inline
typename
List
<
T
>::
Builder
operator
[](
uint
index
)
{
KJ_IREQUIRE
(
index
<
size
());
KJ_IREQUIRE
(
index
<
size
());
return
typename
List
<
T
>::
Builder
(
List
<
T
>::
getAsElementOf
(
builder
,
index
));
return
typename
List
<
T
>::
Builder
(
_
::
PointerHelpers
<
List
<
T
>>::
get
(
builder
.
getPointerElement
(
index
*
ELEMENTS
)));
}
}
inline
typename
List
<
T
>::
Builder
init
(
uint
index
,
uint
size
)
{
inline
typename
List
<
T
>::
Builder
init
(
uint
index
,
uint
size
)
{
KJ_IREQUIRE
(
index
<
this
->
size
());
KJ_IREQUIRE
(
index
<
this
->
size
());
return
typename
List
<
T
>::
Builder
(
List
<
T
>::
initAsElementOf
(
builder
,
index
,
size
));
return
typename
List
<
T
>::
Builder
(
_
::
PointerHelpers
<
List
<
T
>>::
init
(
builder
.
getPointerElement
(
index
*
ELEMENTS
),
size
));
}
}
inline
void
set
(
uint
index
,
typename
List
<
T
>::
Reader
value
)
{
inline
void
set
(
uint
index
,
typename
List
<
T
>::
Reader
value
)
{
KJ_IREQUIRE
(
index
<
size
());
KJ_IREQUIRE
(
index
<
size
());
...
@@ -426,31 +393,15 @@ struct List<List<T>, Kind::LIST> {
...
@@ -426,31 +393,15 @@ struct List<List<T>, Kind::LIST> {
};
};
private
:
private
:
inline
static
_
::
ListBuilder
initAsElementOf
(
inline
static
_
::
ListBuilder
initPointer
(
_
::
PointerBuilder
builder
,
uint
size
)
{
_
::
ListBuilder
&
builder
,
uint
index
,
uint
size
)
{
return
builder
.
initList
(
_
::
FieldSize
::
POINTER
,
size
*
ELEMENTS
);
return
builder
.
getPointerElement
(
index
*
ELEMENTS
)
.
initList
(
_
::
FieldSize
::
POINTER
,
size
*
ELEMENTS
);
}
}
inline
static
_
::
ListBuilder
getAsElementOf
(
inline
static
_
::
ListBuilder
getFromPointer
(
_
::
PointerBuilder
builder
,
const
word
*
defaultValue
)
{
_
::
ListBuilder
&
builder
,
uint
index
)
{
return
builder
.
getList
(
_
::
FieldSize
::
POINTER
,
defaultValue
);
return
builder
.
getPointerElement
(
index
*
ELEMENTS
).
getList
(
_
::
FieldSize
::
POINTER
,
nullptr
);
}
}
inline
static
_
::
ListReader
getAsElementOf
(
inline
static
_
::
ListReader
getFromPointer
(
const
_
::
ListReader
&
reader
,
uint
index
)
{
const
_
::
PointerReader
&
reader
,
const
word
*
defaultValue
)
{
return
reader
.
getPointerElement
(
index
*
ELEMENTS
).
getList
(
_
::
FieldSize
::
POINTER
,
nullptr
);
return
reader
.
getList
(
_
::
FieldSize
::
POINTER
,
defaultValue
);
}
inline
static
_
::
ListBuilder
initAsFieldOf
(
_
::
StructBuilder
&
builder
,
WirePointerCount
index
,
uint
size
)
{
return
builder
.
getPointerField
(
index
).
initList
(
_
::
FieldSize
::
POINTER
,
size
*
ELEMENTS
);
}
inline
static
_
::
ListBuilder
getAsFieldOf
(
_
::
StructBuilder
&
builder
,
WirePointerCount
index
,
const
word
*
defaultValue
)
{
return
builder
.
getPointerField
(
index
).
getList
(
_
::
FieldSize
::
POINTER
,
defaultValue
);
}
inline
static
_
::
ListReader
getAsFieldOf
(
const
_
::
StructReader
&
reader
,
WirePointerCount
index
,
const
word
*
defaultValue
)
{
return
reader
.
getPointerField
(
index
).
getList
(
_
::
FieldSize
::
POINTER
,
defaultValue
);
}
}
template
<
typename
U
,
Kind
k
>
template
<
typename
U
,
Kind
k
>
...
@@ -536,33 +487,15 @@ struct List<T, Kind::BLOB> {
...
@@ -536,33 +487,15 @@ struct List<T, Kind::BLOB> {
};
};
private
:
private
:
inline
static
_
::
ListBuilder
initAsElementOf
(
inline
static
_
::
ListBuilder
initPointer
(
_
::
PointerBuilder
builder
,
uint
size
)
{
_
::
ListBuilder
&
builder
,
uint
index
,
uint
size
)
{
return
builder
.
initList
(
_
::
FieldSize
::
POINTER
,
size
*
ELEMENTS
);
return
builder
.
getPointerElement
(
index
*
ELEMENTS
)
.
initList
(
_
::
FieldSize
::
POINTER
,
size
*
ELEMENTS
);
}
inline
static
_
::
ListBuilder
getAsElementOf
(
_
::
ListBuilder
&
builder
,
uint
index
)
{
return
builder
.
getPointerElement
(
index
*
ELEMENTS
)
.
getList
(
_
::
FieldSize
::
POINTER
,
nullptr
);
}
inline
static
_
::
ListReader
getAsElementOf
(
const
_
::
ListReader
&
reader
,
uint
index
)
{
return
reader
.
getPointerElement
(
index
*
ELEMENTS
)
.
getList
(
_
::
FieldSize
::
POINTER
,
nullptr
);
}
inline
static
_
::
ListBuilder
initAsFieldOf
(
_
::
StructBuilder
&
builder
,
WirePointerCount
index
,
uint
size
)
{
return
builder
.
getPointerField
(
index
).
initList
(
_
::
FieldSize
::
POINTER
,
size
*
ELEMENTS
);
}
}
inline
static
_
::
ListBuilder
getAsFieldOf
(
inline
static
_
::
ListBuilder
getFromPointer
(
_
::
PointerBuilder
builder
,
const
word
*
defaultValue
)
{
_
::
StructBuilder
&
builder
,
WirePointerCount
index
,
const
word
*
defaultValue
)
{
return
builder
.
getList
(
_
::
FieldSize
::
POINTER
,
defaultValue
);
return
builder
.
getPointerField
(
index
).
getList
(
_
::
FieldSize
::
POINTER
,
defaultValue
);
}
}
inline
static
_
::
ListReader
get
AsFieldOf
(
inline
static
_
::
ListReader
get
FromPointer
(
const
_
::
StructReader
&
reader
,
WirePointerCount
index
,
const
word
*
defaultValue
)
{
const
_
::
PointerReader
&
reader
,
const
word
*
defaultValue
)
{
return
reader
.
get
PointerField
(
index
).
get
List
(
_
::
FieldSize
::
POINTER
,
defaultValue
);
return
reader
.
getList
(
_
::
FieldSize
::
POINTER
,
defaultValue
);
}
}
template
<
typename
U
,
Kind
k
>
template
<
typename
U
,
Kind
k
>
...
...
c++/src/capnp/pointer-helpers.h
0 → 100644
View file @
58d8f75c
// Copyright (c) 2013, Kenton Varda <temporal@gmail.com>
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice, this
// list of conditions and the following disclaimer.
// 2. Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#ifndef CAPNP_POINTER_HELPERS_H_
#define CAPNP_POINTER_HELPERS_H_
#include "layout.h"
#include "list.h"
namespace
capnp
{
namespace
_
{
// private
// PointerHelpers is a template class that assists in wrapping/unwrapping the low-level types in
// layout.h with the high-level public API and generated types. This way, the code generator
// and other templates do not have to specialize on each kind of pointer.
template
<
typename
T
>
struct
PointerHelpers
<
T
,
Kind
::
STRUCT
>
{
static
inline
typename
T
::
Reader
get
(
PointerReader
reader
,
const
word
*
defaultValue
=
nullptr
)
{
return
typename
T
::
Reader
(
reader
.
getStruct
(
defaultValue
));
}
static
inline
typename
T
::
Builder
get
(
PointerBuilder
builder
,
const
word
*
defaultValue
=
nullptr
)
{
return
typename
T
::
Builder
(
builder
.
getStruct
(
structSize
<
T
>
(),
defaultValue
));
}
static
inline
void
set
(
PointerBuilder
builder
,
typename
T
::
Reader
value
)
{
builder
.
setStruct
(
value
.
_reader
);
}
static
inline
typename
T
::
Builder
init
(
PointerBuilder
builder
)
{
return
typename
T
::
Builder
(
builder
.
initStruct
(
structSize
<
T
>
()));
}
static
inline
void
adopt
(
PointerBuilder
builder
,
Orphan
<
T
>&&
value
)
{
builder
.
adopt
(
kj
::
mv
(
value
.
builder
));
}
static
inline
Orphan
<
T
>
disown
(
PointerBuilder
builder
)
{
return
Orphan
<
T
>
(
builder
.
disown
());
}
};
template
<
typename
T
>
struct
PointerHelpers
<
List
<
T
>
,
Kind
::
LIST
>
{
static
inline
typename
List
<
T
>::
Reader
get
(
PointerReader
reader
,
const
word
*
defaultValue
=
nullptr
)
{
return
typename
List
<
T
>::
Reader
(
List
<
T
>::
getFromPointer
(
reader
,
defaultValue
));
}
static
inline
typename
List
<
T
>::
Builder
get
(
PointerBuilder
builder
,
const
word
*
defaultValue
=
nullptr
)
{
return
typename
List
<
T
>::
Builder
(
List
<
T
>::
getFromPointer
(
builder
,
defaultValue
));
}
static
inline
void
set
(
PointerBuilder
builder
,
typename
List
<
T
>::
Reader
value
)
{
builder
.
setList
(
value
.
reader
);
}
template
<
typename
U
>
static
void
set
(
PointerBuilder
builder
,
std
::
initializer_list
<
U
>
value
)
{
auto
l
=
init
(
builder
,
value
.
size
());
uint
i
=
0
;
for
(
auto
&
element
:
value
)
{
l
.
set
(
i
++
,
element
);
}
}
static
inline
typename
List
<
T
>::
Builder
init
(
PointerBuilder
builder
,
uint
size
)
{
return
typename
List
<
T
>::
Builder
(
List
<
T
>::
initPointer
(
builder
,
size
));
}
static
inline
void
adopt
(
PointerBuilder
builder
,
Orphan
<
List
<
T
>>&&
value
)
{
builder
.
adopt
(
kj
::
mv
(
value
.
builder
));
}
static
inline
Orphan
<
List
<
T
>>
disown
(
PointerBuilder
builder
)
{
return
Orphan
<
List
<
T
>>
(
builder
.
disown
());
}
};
template
<
typename
T
>
struct
PointerHelpers
<
T
,
Kind
::
BLOB
>
{
static
inline
typename
T
::
Reader
get
(
PointerReader
reader
,
const
void
*
defaultValue
=
nullptr
,
uint
defaultBytes
=
0
)
{
return
reader
.
getBlob
<
T
>
(
defaultValue
,
defaultBytes
*
BYTES
);
}
static
inline
typename
T
::
Builder
get
(
PointerBuilder
builder
,
const
void
*
defaultValue
=
nullptr
,
uint
defaultBytes
=
0
)
{
return
builder
.
getBlob
<
T
>
(
defaultValue
,
defaultBytes
*
BYTES
);
}
static
inline
void
set
(
PointerBuilder
builder
,
typename
T
::
Reader
value
)
{
builder
.
setBlob
<
T
>
(
value
);
}
static
inline
typename
T
::
Builder
init
(
PointerBuilder
builder
,
uint
size
)
{
return
builder
.
initBlob
<
T
>
(
size
*
BYTES
);
}
static
inline
void
adopt
(
PointerBuilder
builder
,
Orphan
<
T
>&&
value
)
{
builder
.
adopt
(
kj
::
mv
(
value
.
builder
));
}
static
inline
Orphan
<
T
>
disown
(
PointerBuilder
builder
)
{
return
Orphan
<
T
>
(
builder
.
disown
());
}
};
struct
UncheckedMessage
{
typedef
const
word
*
Reader
;
};
template
<>
struct
PointerHelpers
<
UncheckedMessage
>
{
// Reads an Object field as an unchecked message pointer. Requires that the containing message is
// itself unchecked. This hack is currently private. It is used to locate default values within
// encoded schemas.
static
inline
const
word
*
get
(
PointerReader
reader
)
{
return
reader
.
getUnchecked
();
}
};
}
// namespace _ (private)
}
// namespace capnp
#endif // CAPNP_POINTER_HELPERS_H_
c++/src/capnp/schema.capnp.h
View file @
58d8f75c
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment