Skip to content

Commit 4f3e037

Browse files
committed
Merge branch '6-add-c-11-option' into 'dev'
Resolve "Add C++ 11 option" Closes #6 See merge request objectbox/objectbox-generator!4
2 parents 84dcc5f + 20bca85 commit 4f3e037

15 files changed

Lines changed: 640 additions & 31 deletions

File tree

cmd/objectbox-generator/objectbox-generator.go

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,11 @@ import (
2929
"os"
3030
"strings"
3131

32-
"github.com/objectbox/objectbox-generator/cmd"
32+
generatorcmd "github.com/objectbox/objectbox-generator/cmd"
3333
"github.com/objectbox/objectbox-generator/internal/generator"
34-
"github.com/objectbox/objectbox-generator/internal/generator/c"
34+
cgenerator "github.com/objectbox/objectbox-generator/internal/generator/c"
3535
"github.com/objectbox/objectbox-generator/internal/generator/flatbuffersc"
36-
"github.com/objectbox/objectbox-generator/internal/generator/go"
36+
gogenerator "github.com/objectbox/objectbox-generator/internal/generator/go"
3737
)
3838

3939
func main() {
@@ -86,7 +86,8 @@ Available flags:
8686
func (cmd *command) ConfigureFlags() {
8787
cmd.langs = make(map[string]*bool)
8888
cmd.langs["c"] = flag.Bool("c", false, "generate plain C code")
89-
cmd.langs["cpp"] = flag.Bool("cpp", false, "generate C++ code")
89+
cmd.langs["cpp"] = flag.Bool("cpp", false, "generate C++ code (at least C++14)")
90+
cmd.langs["cpp11"] = flag.Bool("cpp11", false, "generate C++11 code")
9091
cmd.langs["go"] = flag.Bool("go", false, "generate Go code")
9192

9293
// for c++ generator
@@ -113,13 +114,21 @@ func (cmd *command) ParseFlags(remainingPosArgs *[]string, options *generator.Op
113114
options.CodeGenerator = &gogenerator.GoGenerator{}
114115
case "c":
115116
options.CodeGenerator = &cgenerator.CGenerator{
116-
PlainC: true,
117-
Optional: "ptr", // dummy value for checks to evaluate to true if "optional" annotation is used
117+
PlainC: true,
118+
LangVersion: -1, // unspecified, take the default
119+
Optional: "ptr", // dummy value for checks to evaluate to true if "optional" annotation is used
118120
}
119121
case "cpp":
120122
options.CodeGenerator = &cgenerator.CGenerator{
121-
PlainC: false,
122-
Optional: *cmd.optional,
123+
PlainC: false,
124+
LangVersion: 14,
125+
Optional: *cmd.optional,
126+
}
127+
case "cpp11":
128+
options.CodeGenerator = &cgenerator.CGenerator{
129+
PlainC: false,
130+
LangVersion: 11,
131+
Optional: *cmd.optional,
123132
}
124133
default:
125134
return errors.New("you must specify an output language")

internal/generator/c/cgenerator.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,9 @@ import (
3434
)
3535

3636
type CGenerator struct {
37-
PlainC bool
38-
Optional string // std::optional, std::unique_ptr, std::shared_ptr
37+
PlainC bool
38+
LangVersion int // -1: unset, cpp: 11, 14, 17
39+
Optional string // std::optional, std::unique_ptr, std::shared_ptr
3940
}
4041

4142
// BindingFiles returns names of binding files for the given entity file.
@@ -130,7 +131,8 @@ func (gen *CGenerator) generateBindingFile(bindingFile, headerFile string, m *mo
130131
FileIdentifier string
131132
HeaderFile string
132133
Optional string
133-
}{m, generator.VersionId, fileIdentifier, filepath.Base(headerFile), gen.Optional}
134+
LangVersion int
135+
}{m, generator.VersionId, fileIdentifier, filepath.Base(headerFile), gen.Optional, gen.LangVersion}
134136

135137
var tpl *template.Template
136138

internal/generator/c/templates/binding-cpp.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,11 @@ void {{$entity.Meta.CppNamespacePrefix}}{{$entity.Meta.CppName}}::_OBX_MetaInfo:
6767
}
6868
6969
std::unique_ptr<{{$entity.Meta.CppNamespacePrefix}}{{$entity.Meta.CppName}}> {{$entity.Meta.CppNamespacePrefix}}{{$entity.Meta.CppName}}::_OBX_MetaInfo::newFromFlatBuffer(const void* data, size_t size) {
70+
{{- if ge $.LangVersion 14 }}
71+
auto object = std::make_unique<{{$entity.Meta.CppNamespacePrefix}}{{$entity.Meta.CppName}}>();
72+
{{- else}}
7073
auto object = std::unique_ptr<{{$entity.Meta.CppNamespacePrefix}}{{$entity.Meta.CppName}}>(new {{$entity.Meta.CppNamespacePrefix}}{{$entity.Meta.CppName}}());
74+
{{- end}}
7175
fromFlatBuffer(data, size, *object);
7276
return object;
7377
}

test/comparison/c-helper.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ import (
2727
"testing"
2828

2929
"github.com/objectbox/objectbox-generator/internal/generator"
30-
"github.com/objectbox/objectbox-generator/internal/generator/c"
30+
cgenerator "github.com/objectbox/objectbox-generator/internal/generator/c"
3131
"github.com/objectbox/objectbox-generator/test/assert"
3232
"github.com/objectbox/objectbox-generator/test/build"
3333
"github.com/objectbox/objectbox-generator/test/cmake"
@@ -80,7 +80,11 @@ func (h cTestHelper) build(t *testing.T, conf testSpec, dir string, expectedErro
8080

8181
var mainFile string
8282
if cmak.IsCpp {
83-
cmak.Standard = 11
83+
if conf.targetLang == "cpp11" {
84+
cmak.Standard = 11
85+
} else {
86+
cmak.Standard = 14
87+
}
8488
mainFile = path.Join(cmak.ConfDir, "main.cpp")
8589
} else {
8690
cmak.Standard = 99

test/comparison/conf.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@ import (
2323
"testing"
2424

2525
"github.com/objectbox/objectbox-generator/internal/generator"
26-
"github.com/objectbox/objectbox-generator/internal/generator/c"
27-
"github.com/objectbox/objectbox-generator/internal/generator/go"
26+
cgenerator "github.com/objectbox/objectbox-generator/internal/generator/c"
27+
gogenerator "github.com/objectbox/objectbox-generator/internal/generator/go"
2828
)
2929

3030
type testHelper interface {
@@ -52,7 +52,8 @@ type testSpec struct {
5252
}
5353

5454
var confs = map[string]testSpec{
55-
"fbs-c": {"c", ".fbs", []string{".obx.h"}, &cgenerator.CGenerator{PlainC: true}, &cTestHelper{cpp: false}},
56-
"fbs-cpp": {"cpp", ".fbs", []string{".obx.hpp", ".obx.cpp"}, &cgenerator.CGenerator{PlainC: false}, &cTestHelper{cpp: true}},
57-
"go": {"go", ".go", []string{".obx.go"}, &gogenerator.GoGenerator{}, &goTestHelper{}},
55+
"fbs-c": {"c", ".fbs", []string{".obx.h"}, &cgenerator.CGenerator{PlainC: true, LangVersion: -1}, &cTestHelper{cpp: false}},
56+
"fbs-cpp": {"cpp", ".fbs", []string{".obx.hpp", ".obx.cpp"}, &cgenerator.CGenerator{PlainC: false, LangVersion: 14}, &cTestHelper{cpp: true}},
57+
"fbs-cpp11": {"cpp11", ".fbs", []string{".obx.hpp", ".obx.cpp"}, &cgenerator.CGenerator{PlainC: false, LangVersion: 11}, &cTestHelper{cpp: true}},
58+
"go": {"go", ".go", []string{".obx.go"}, &gogenerator.GoGenerator{}, &goTestHelper{}},
5859
}

test/comparison/testdata/fbs/typeful/cpp/schema.obx.cpp.expected

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ Typeful Typeful::_OBX_MetaInfo::fromFlatBuffer(const void* data, size_t size) {
6868
}
6969

7070
std::unique_ptr<Typeful> Typeful::_OBX_MetaInfo::newFromFlatBuffer(const void* data, size_t size) {
71-
auto object = std::unique_ptr<Typeful>(new Typeful());
71+
auto object = std::make_unique<Typeful>();
7272
fromFlatBuffer(data, size, *object);
7373
return object;
7474
}
@@ -161,7 +161,7 @@ ns::Annotated ns::Annotated::_OBX_MetaInfo::fromFlatBuffer(const void* data, siz
161161
}
162162

163163
std::unique_ptr<ns::Annotated> ns::Annotated::_OBX_MetaInfo::newFromFlatBuffer(const void* data, size_t size) {
164-
auto object = std::unique_ptr<ns::Annotated>(new ns::Annotated());
164+
auto object = std::make_unique<ns::Annotated>();
165165
fromFlatBuffer(data, size, *object);
166166
return object;
167167
}
@@ -216,7 +216,7 @@ ns::TSDate ns::TSDate::_OBX_MetaInfo::fromFlatBuffer(const void* data, size_t si
216216
}
217217

218218
std::unique_ptr<ns::TSDate> ns::TSDate::_OBX_MetaInfo::newFromFlatBuffer(const void* data, size_t size) {
219-
auto object = std::unique_ptr<ns::TSDate>(new ns::TSDate());
219+
auto object = std::make_unique<ns::TSDate>();
220220
fromFlatBuffer(data, size, *object);
221221
return object;
222222
}
@@ -249,7 +249,7 @@ ns::TSDateNano ns::TSDateNano::_OBX_MetaInfo::fromFlatBuffer(const void* data, s
249249
}
250250

251251
std::unique_ptr<ns::TSDateNano> ns::TSDateNano::_OBX_MetaInfo::newFromFlatBuffer(const void* data, size_t size) {
252-
auto object = std::unique_ptr<ns::TSDateNano>(new ns::TSDateNano());
252+
auto object = std::make_unique<ns::TSDateNano>();
253253
fromFlatBuffer(data, size, *object);
254254
return object;
255255
}
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
// Code generated by ObjectBox; DO NOT EDIT.
2+
3+
#pragma once
4+
5+
#ifdef __cplusplus
6+
#include <cstdbool>
7+
#include <cstdint>
8+
extern "C" {
9+
#else
10+
#include <stdbool.h>
11+
#include <stdint.h>
12+
#endif
13+
#include "objectbox.h"
14+
15+
/// Initializes an ObjectBox model for all entities.
16+
/// The returned pointer may be NULL if the allocation failed. If the returned model is not NULL, you should check if
17+
/// any error occurred by calling obx_model_error_code() and/or obx_model_error_message(). If an error occurred, you're
18+
/// responsible for freeing the resources by calling obx_model_free().
19+
/// In case there was no error when setting the model up (i.e. obx_model_error_code() returned 0), you may configure
20+
/// OBX_store_options with the model by calling obx_opt_model() and subsequently opening a store with obx_store_open().
21+
/// As soon as you call obx_store_open(), the model pointer is consumed and MUST NOT be freed manually.
22+
static inline OBX_model* create_obx_model() {
23+
OBX_model* model = obx_model();
24+
if (!model) return NULL;
25+
26+
obx_model_entity(model, "Typeful", 1, 8717895732742165505);
27+
obx_model_entity_flags(model, (OBXEntityFlags) (OBXEntityFlags_SHARED_GLOBAL_IDS | OBXEntityFlags_SYNC_ENABLED));
28+
obx_model_property(model, "id", OBXPropertyType_Long, 1, 3390393562759376202);
29+
obx_model_property_flags(model, OBXPropertyFlags_ID);
30+
obx_model_property(model, "int", OBXPropertyType_Int, 2, 2669985732393126063);
31+
obx_model_property(model, "int8", OBXPropertyType_Byte, 3, 1774932891286980153);
32+
obx_model_property(model, "int16", OBXPropertyType_Short, 4, 6044372234677422456);
33+
obx_model_property(model, "int32", OBXPropertyType_Int, 5, 8274930044578894929);
34+
obx_model_property(model, "int64", OBXPropertyType_Long, 6, 1543572285742637646);
35+
obx_model_property(model, "uint", OBXPropertyType_Int, 7, 2661732831099943416);
36+
obx_model_property_flags(model, OBXPropertyFlags_UNSIGNED);
37+
obx_model_property(model, "uint8", OBXPropertyType_Byte, 8, 8325060299420976708);
38+
obx_model_property_flags(model, OBXPropertyFlags_UNSIGNED);
39+
obx_model_property(model, "uint16", OBXPropertyType_Short, 9, 7837839688282259259);
40+
obx_model_property_flags(model, OBXPropertyFlags_UNSIGNED);
41+
obx_model_property(model, "uint32", OBXPropertyType_Int, 10, 2518412263346885298);
42+
obx_model_property_flags(model, OBXPropertyFlags_UNSIGNED);
43+
obx_model_property(model, "uint64", OBXPropertyType_Long, 11, 5617773211005988520);
44+
obx_model_property_flags(model, OBXPropertyFlags_UNSIGNED);
45+
obx_model_property(model, "bool", OBXPropertyType_Bool, 12, 2339563716805116249);
46+
obx_model_property(model, "string", OBXPropertyType_String, 13, 7144924247938981575);
47+
obx_model_property(model, "stringvector", OBXPropertyType_StringVector, 14, 161231572858529631);
48+
obx_model_property(model, "byte", OBXPropertyType_Byte, 15, 7259475919510918339);
49+
obx_model_property(model, "ubyte", OBXPropertyType_Byte, 16, 7373105480197164748);
50+
obx_model_property_flags(model, OBXPropertyFlags_UNSIGNED);
51+
obx_model_property(model, "bytevector", OBXPropertyType_ByteVector, 17, 3287288577352441706);
52+
obx_model_property(model, "ubytevector", OBXPropertyType_ByteVector, 18, 3930927879439176946);
53+
obx_model_property(model, "float32", OBXPropertyType_Float, 19, 4706154865122290029);
54+
obx_model_property(model, "float64", OBXPropertyType_Double, 20, 2217592893536642650);
55+
obx_model_property(model, "float", OBXPropertyType_Float, 21, 1929546706668609706);
56+
obx_model_property(model, "double", OBXPropertyType_Double, 22, 6392442863481646880);
57+
obx_model_property(model, "relId", OBXPropertyType_Relation, 23, 3706853784096366226);
58+
obx_model_property_flags(model, (OBXPropertyFlags) (OBXPropertyFlags_INDEXED | OBXPropertyFlags_INDEX_PARTIAL_SKIP_ZERO));
59+
obx_model_property_relation(model, "AnnotatedEntity", 1, 2627038740284806767);
60+
obx_model_entity_last_property_id(model, 23, 3706853784096366226);
61+
62+
obx_model_entity(model, "AnnotatedEntity", 2, 2259404117704393152);
63+
obx_model_entity_flags(model, OBXEntityFlags_SYNC_ENABLED);
64+
obx_model_property(model, "identifier", OBXPropertyType_Long, 1, 6303220950515014660);
65+
obx_model_property_flags(model, (OBXPropertyFlags) (OBXPropertyFlags_ID | OBXPropertyFlags_ID_SELF_ASSIGNABLE));
66+
obx_model_property(model, "name", OBXPropertyType_String, 2, 4035568504096476779);
67+
obx_model_property_flags(model, OBXPropertyFlags_INDEX_HASH);
68+
obx_model_property_index_id(model, 2, 959367522974354090);
69+
obx_model_property(model, "time", OBXPropertyType_Date, 3, 2914295034816259174);
70+
obx_model_property(model, "relId", OBXPropertyType_Relation, 4, 1395437218309923052);
71+
obx_model_property_flags(model, (OBXPropertyFlags) (OBXPropertyFlags_INDEXED | OBXPropertyFlags_INDEX_PARTIAL_SKIP_ZERO));
72+
obx_model_property_relation(model, "Typeful", 3, 6745438398739480977);
73+
obx_model_property(model, "unique", OBXPropertyType_String, 5, 2897681629866238117);
74+
obx_model_property_flags(model, (OBXPropertyFlags) (OBXPropertyFlags_INDEX_HASH | OBXPropertyFlags_UNIQUE));
75+
obx_model_property_index_id(model, 4, 3398579248012586914);
76+
obx_model_property(model, "uniqueValue", OBXPropertyType_String, 6, 5974317550424871033);
77+
obx_model_property_flags(model, (OBXPropertyFlags) (OBXPropertyFlags_INDEXED | OBXPropertyFlags_UNIQUE));
78+
obx_model_property_index_id(model, 5, 3317123977833389635);
79+
obx_model_property(model, "uniqueHash", OBXPropertyType_String, 7, 5001958211167890979);
80+
obx_model_property_flags(model, (OBXPropertyFlags) (OBXPropertyFlags_INDEX_HASH | OBXPropertyFlags_UNIQUE));
81+
obx_model_property_index_id(model, 6, 167566062957544642);
82+
obx_model_property(model, "uniqueHash64", OBXPropertyType_String, 8, 4778690082005258714);
83+
obx_model_property_flags(model, (OBXPropertyFlags) (OBXPropertyFlags_INDEX_HASH64 | OBXPropertyFlags_UNIQUE));
84+
obx_model_property_index_id(model, 7, 1059542851699319360);
85+
obx_model_property(model, "uid", OBXPropertyType_Int, 9, 6972732843819909978);
86+
obx_model_property_flags(model, (OBXPropertyFlags) (OBXPropertyFlags_INDEXED | OBXPropertyFlags_UNIQUE));
87+
obx_model_property_index_id(model, 8, 5558237345453186302);
88+
obx_model_relation(model, 1, 7845762441295307478, 1, 8717895732742165505);
89+
obx_model_relation(model, 2, 771642788862502430, 1, 8717895732742165505);
90+
obx_model_entity_last_property_id(model, 9, 6972732843819909978);
91+
92+
obx_model_entity(model, "TSDate", 3, 6050128673802995827);
93+
obx_model_property(model, "id", OBXPropertyType_Long, 1, 8514850266767180993);
94+
obx_model_property_flags(model, OBXPropertyFlags_ID);
95+
obx_model_property(model, "timestamp", OBXPropertyType_Date, 2, 8683452355129068124);
96+
obx_model_property_flags(model, OBXPropertyFlags_ID_COMPANION);
97+
obx_model_entity_last_property_id(model, 2, 8683452355129068124);
98+
99+
obx_model_entity(model, "TSDateNano", 4, 501233450539197794);
100+
obx_model_property(model, "id", OBXPropertyType_Long, 1, 4345851588384648695);
101+
obx_model_property_flags(model, OBXPropertyFlags_ID);
102+
obx_model_property(model, "timestamp", OBXPropertyType_DateNano, 2, 7699391924090763411);
103+
obx_model_property_flags(model, OBXPropertyFlags_ID_COMPANION);
104+
obx_model_entity_last_property_id(model, 2, 7699391924090763411);
105+
106+
obx_model_last_entity_id(model, 4, 501233450539197794);
107+
obx_model_last_index_id(model, 8, 5558237345453186302);
108+
obx_model_last_relation_id(model, 2, 771642788862502430);
109+
return model; // NOTE: the returned model will contain error information if an error occurred.
110+
}
111+
112+
#ifdef __cplusplus
113+
}
114+
#endif

0 commit comments

Comments
 (0)