From 569492e8900e93a826381dd08e8ce419727c1f52 Mon Sep 17 00:00:00 2001 From: Stewart Miles Date: Mon, 8 Oct 2018 12:43:57 -0700 Subject: [PATCH] Disable armeabi builds for Android and re-enable CI builds. (#4970) armeabi support was removed from the Android NDK so we should no longer build it. Since this fixes the Android build failures this commit also re-enables Travis Android builds. While re-enabling Android builds, some recent changes broke C++98 support so this fixes those issues as well which include: - Conditionally compiling use of move constructors, operators and std::move. - Changing sample to use flatbuffers::unique_ptr rather than std::unique_ptr. Finally, added the special "default_ptr_type" value for the "cpp_ptr_type" attribute. This expands to the value passed to the "--cpp-ptr-type" argument of flatc. --- .travis.yml | 46 +++++++-------- android/build.gradle | 2 +- docs/source/CppUsage.md | 4 +- include/flatbuffers/flatbuffers.h | 46 +++++++++++++++ samples/android/build.gradle | 2 +- src/idl_gen_cpp.cpp | 3 +- tests/monster_test.bfbs | Bin 6352 -> 6360 bytes tests/monster_test.fbs | 4 +- tests/monster_test_generated.h | 8 +-- tests/test_builder.cpp | 18 ++++++ tests/test_builder.h | 92 +++++++++++++++++++----------- 11 files changed, 158 insertions(+), 67 deletions(-) diff --git a/.travis.yml b/.travis.yml index 331ea5761..d056fd357 100644 --- a/.travis.yml +++ b/.travis.yml @@ -121,26 +121,26 @@ matrix: osx_image: xcode9.3 env: CONAN_APPLE_CLANG_VERSIONS=9.1 - #- language: android - # sudo: true - # android: - # components: - # - tools - # - platform-tools - # - build-tools-25.0.2 - # - android-25 - # - extra-android-m2repository - # compiler: - # - gcc - # before_install: - # - git clone https://github.com/urho3d/android-ndk.git $HOME/android-ndk-root - # - export ANDROID_NDK_HOME=$HOME/android-ndk-root - # # Setup environment for Linux build which is required to build the sample. - # - if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test; fi - # - if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo apt-get update -qq; fi - # - if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo apt-get install -qq g++-$GCC_VERSION; fi - # - if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo apt-get install -qq gcc-$GCC_VERSION; fi - # - if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo ln -s -v -f $(which g++-$GCC_VERSION) /usr/bin/g++; fi - # - if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo ln -s -v -f $(which gcc-$GCC_VERSION) /usr/bin/gcc; fi - # script: - # - failed=0; for build_gradle in $(git ls-files | grep build.gradle); do ( cd "$(dirname "${build_gradle}")" && ./gradlew build ) || failed=1; done; exit $((failed)) + - language: android + sudo: true + android: + components: + - tools + - platform-tools + - build-tools-25.0.2 + - android-25 + - extra-android-m2repository + compiler: + - gcc + before_install: + - git clone https://github.com/urho3d/android-ndk.git $HOME/android-ndk-root + - export ANDROID_NDK_HOME=$HOME/android-ndk-root + # Setup environment for Linux build which is required to build the sample. + - if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test; fi + - if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo apt-get update -qq; fi + - if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo apt-get install -qq g++-$GCC_VERSION; fi + - if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo apt-get install -qq gcc-$GCC_VERSION; fi + - if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo ln -s -v -f $(which g++-$GCC_VERSION) /usr/bin/g++; fi + - if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo ln -s -v -f $(which gcc-$GCC_VERSION) /usr/bin/gcc; fi + script: + - failed=0; for build_gradle in $(git ls-files | grep build.gradle); do ( cd "$(dirname "${build_gradle}")" && ./gradlew build ) || failed=1; done; exit $((failed)) diff --git a/android/build.gradle b/android/build.gradle index 73e4188c8..5e9809be7 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -66,7 +66,7 @@ android { ndkBuild { targets "FlatBufferTest" arguments "-j" + Runtime.getRuntime().availableProcessors() - abiFilters "armeabi", "armeabi-v7a", "arm64-v8a", "x86", "x86_64" + abiFilters "armeabi-v7a", "arm64-v8a", "x86", "x86_64" } } } diff --git a/docs/source/CppUsage.md b/docs/source/CppUsage.md index fff04a9d9..e13e1bad1 100644 --- a/docs/source/CppUsage.md +++ b/docs/source/CppUsage.md @@ -240,7 +240,9 @@ influence this either globally (using the `--cpp-ptr-type` argument to `flatc`) or per field (using the `cpp_ptr_type` attribute) to by any smart pointer type (`my_ptr`), or by specifying `naked` as the type to get `T *` pointers. Unlike the smart pointers, naked pointers do not manage memory for -you, so you'll have to manage their lifecycles manually. +you, so you'll have to manage their lifecycles manually. To reference the +pointer type specified by the `--cpp-ptr-type` argument to `flatc` from a +flatbuffer field set the `cpp_ptr_type` attribute to `default_ptr_type`. # Using different string type. diff --git a/include/flatbuffers/flatbuffers.h b/include/flatbuffers/flatbuffers.h index fdbe2ea69..9ab36490c 100644 --- a/include/flatbuffers/flatbuffers.h +++ b/include/flatbuffers/flatbuffers.h @@ -104,10 +104,14 @@ template struct VectorIterator { return *this; } + // clang-format off + #if !defined(FLATBUFFERS_CPP98_STL) VectorIterator &operator=(VectorIterator &&other) { data_ = other.data_; return *this; } + #endif // !defined(FLATBUFFERS_CPP98_STL) + // clang-format on bool operator==(const VectorIterator &other) const { return data_ == other.data_; @@ -469,6 +473,9 @@ class DetachedBuffer { cur_(cur), size_(sz) {} + // clang-format off + #if !defined(FLATBUFFERS_CPP98_STL) + // clang-format on DetachedBuffer(DetachedBuffer &&other) : allocator_(other.allocator_), own_allocator_(other.own_allocator_), @@ -478,7 +485,13 @@ class DetachedBuffer { size_(other.size_) { other.reset(); } + // clang-format off + #endif // !defined(FLATBUFFERS_CPP98_STL) + // clang-format on + // clang-format off + #if !defined(FLATBUFFERS_CPP98_STL) + // clang-format on DetachedBuffer &operator=(DetachedBuffer &&other) { destroy(); @@ -493,6 +506,9 @@ class DetachedBuffer { return *this; } + // clang-format off + #endif // !defined(FLATBUFFERS_CPP98_STL) + // clang-format on ~DetachedBuffer() { destroy(); } @@ -522,10 +538,16 @@ class DetachedBuffer { #endif // clang-format on + // clang-format off + #if !defined(FLATBUFFERS_CPP98_STL) + // clang-format on // These may change access mode, leave these at end of public section FLATBUFFERS_DELETE_FUNC(DetachedBuffer(const DetachedBuffer &other)) FLATBUFFERS_DELETE_FUNC( DetachedBuffer &operator=(const DetachedBuffer &other)) + // clang-format off + #endif // !defined(FLATBUFFERS_CPP98_STL) + // clang-format on protected: Allocator *allocator_; @@ -572,7 +594,13 @@ class vector_downward { cur_(nullptr), scratch_(nullptr) {} + // clang-format off + #if !defined(FLATBUFFERS_CPP98_STL) vector_downward(vector_downward &&other) + #else + vector_downward(vector_downward &other) + #endif // defined(FLATBUFFERS_CPP98_STL) + // clang-format on : allocator_(other.allocator_), own_allocator_(other.own_allocator_), initial_size_(other.initial_size_), @@ -591,12 +619,18 @@ class vector_downward { other.scratch_ = nullptr; } + // clang-format off + #if !defined(FLATBUFFERS_CPP98_STL) + // clang-format on vector_downward &operator=(vector_downward &&other) { // Move construct a temporary and swap idiom vector_downward temp(std::move(other)); swap(temp); return *this; } + // clang-format off + #endif // defined(FLATBUFFERS_CPP98_STL) + // clang-format on ~vector_downward() { clear_buffer(); @@ -842,8 +876,13 @@ class FlatBufferBuilder { EndianCheck(); } + // clang-format off /// @brief Move constructor for FlatBufferBuilder. + #if !defined(FLATBUFFERS_CPP98_STL) FlatBufferBuilder(FlatBufferBuilder &&other) + #else + FlatBufferBuilder(FlatBufferBuilder &other) + #endif // #if !defined(FLATBUFFERS_CPP98_STL) : buf_(1024, nullptr, false, AlignOf()), num_field_loc(0), max_voffset_(0), @@ -858,7 +897,11 @@ class FlatBufferBuilder { // Lack of delegating constructors in vs2010 makes it more verbose than needed. Swap(other); } + // clang-format on + // clang-format off + #if !defined(FLATBUFFERS_CPP98_STL) + // clang-format on /// @brief Move assignment operator for FlatBufferBuilder. FlatBufferBuilder &operator=(FlatBufferBuilder &&other) { // Move construct a temporary and swap idiom @@ -866,6 +909,9 @@ class FlatBufferBuilder { Swap(temp); return *this; } + // clang-format off + #endif // defined(FLATBUFFERS_CPP98_STL) + // clang-format on void Swap(FlatBufferBuilder &other) { using std::swap; diff --git a/samples/android/build.gradle b/samples/android/build.gradle index e6af6d6f3..81c1af0af 100644 --- a/samples/android/build.gradle +++ b/samples/android/build.gradle @@ -66,7 +66,7 @@ android { ndkBuild { targets "FlatBufferSample" arguments "-j" + Runtime.getRuntime().availableProcessors() - abiFilters "armeabi", "armeabi-v7a", "arm64-v8a", "x86", "x86_64" + abiFilters "armeabi-v7a", "arm64-v8a", "x86", "x86_64" } } } diff --git a/src/idl_gen_cpp.cpp b/src/idl_gen_cpp.cpp index a0abfdd5b..8a42c53e8 100644 --- a/src/idl_gen_cpp.cpp +++ b/src/idl_gen_cpp.cpp @@ -578,7 +578,8 @@ class CppGenerator : public BaseGenerator { bool is_constructor) { auto &ptr_type = PtrType(field); if (ptr_type != "naked") { - return ptr_type + "<" + type + ">"; + return (ptr_type != "default_ptr_type" ? ptr_type : + parser_.opts.cpp_object_api_pointer_type) + "<" + type + ">"; } else if (is_constructor) { return ""; } else { diff --git a/tests/monster_test.bfbs b/tests/monster_test.bfbs index a6b87d4a471054fbd03553e5736dccdacdba2bbc..16c1648a7aa0c20e0e50dbc0e8abf73c3802642b 100644 GIT binary patch literal 6360 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 M{C-%g@Y9s`KTC#zVgLXD literal 6352 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 diff --git a/tests/monster_test.fbs b/tests/monster_test.fbs index 57b8061bf..866aa472f 100644 --- a/tests/monster_test.fbs +++ b/tests/monster_test.fbs @@ -89,9 +89,9 @@ table Monster { vector_of_referrables:[Referrable](id:35); single_weak_reference:ulong(id:36, hash:"fnv1a_64", cpp_type:"ReferrableT"); vector_of_weak_references:[ulong](id:37, hash:"fnv1a_64", cpp_type:"ReferrableT"); - vector_of_strong_referrables:[Referrable](id:38, cpp_ptr_type:"std::unique_ptr"); //was shared_ptr + vector_of_strong_referrables:[Referrable](id:38, cpp_ptr_type:"default_ptr_type"); //was shared_ptr co_owning_reference:ulong(id:39, hash:"fnv1a_64", cpp_type:"ReferrableT", cpp_ptr_type:"naked"); //was shared_ptr as well - vector_of_co_owning_references:[ulong](id:40, hash:"fnv1a_64", cpp_type:"ReferrableT", cpp_ptr_type:"std::unique_ptr", cpp_ptr_type_get:".get()"); //was shared_ptr + vector_of_co_owning_references:[ulong](id:40, hash:"fnv1a_64", cpp_type:"ReferrableT", cpp_ptr_type:"default_ptr_type", cpp_ptr_type_get:".get()"); //was shared_ptr non_owning_reference:ulong(id:41, hash:"fnv1a_64", cpp_type:"ReferrableT", cpp_ptr_type:"naked", cpp_ptr_type_get:""); //was weak_ptr vector_of_non_owning_references:[ulong](id:42, hash:"fnv1a_64", cpp_type:"ReferrableT", cpp_ptr_type:"naked", cpp_ptr_type_get:""); //was weak_ptr } diff --git a/tests/monster_test_generated.h b/tests/monster_test_generated.h index 0f5e25213..4fd499419 100644 --- a/tests/monster_test_generated.h +++ b/tests/monster_test_generated.h @@ -802,9 +802,9 @@ struct MonsterT : public flatbuffers::NativeTable { std::vector> vector_of_referrables; ReferrableT *single_weak_reference; std::vector vector_of_weak_references; - std::vector> vector_of_strong_referrables; + std::vector> vector_of_strong_referrables; ReferrableT *co_owning_reference; - std::vector> vector_of_co_owning_references; + std::vector> vector_of_co_owning_references; ReferrableT *non_owning_reference; std::vector vector_of_non_owning_references; MonsterT() @@ -2072,10 +2072,10 @@ if (_resolver) (*_resolver)(reinterpret_cast(&_o->testhashu32_fnv1a), s if (_resolver) (*_resolver)(reinterpret_cast(&_o->single_weak_reference), static_cast(_e)); else _o->single_weak_reference = nullptr; }; { auto _e = vector_of_weak_references(); if (_e) { _o->vector_of_weak_references.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { //vector resolver, naked if (_resolver) (*_resolver)(reinterpret_cast(&_o->vector_of_weak_references[_i]), static_cast(_e->Get(_i))); else _o->vector_of_weak_references[_i] = nullptr; } } }; - { auto _e = vector_of_strong_referrables(); if (_e) { _o->vector_of_strong_referrables.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->vector_of_strong_referrables[_i] = std::unique_ptr(_e->Get(_i)->UnPack(_resolver)); } } }; + { auto _e = vector_of_strong_referrables(); if (_e) { _o->vector_of_strong_referrables.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->vector_of_strong_referrables[_i] = flatbuffers::unique_ptr(_e->Get(_i)->UnPack(_resolver)); } } }; { auto _e = co_owning_reference(); //scalar resolver, naked if (_resolver) (*_resolver)(reinterpret_cast(&_o->co_owning_reference), static_cast(_e)); else _o->co_owning_reference = nullptr; }; - { auto _e = vector_of_co_owning_references(); if (_e) { _o->vector_of_co_owning_references.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { //vector resolver, std::unique_ptr + { auto _e = vector_of_co_owning_references(); if (_e) { _o->vector_of_co_owning_references.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { //vector resolver, default_ptr_type if (_resolver) (*_resolver)(reinterpret_cast(&_o->vector_of_co_owning_references[_i]), static_cast(_e->Get(_i)));/* else do nothing */; } } }; { auto _e = non_owning_reference(); //scalar resolver, naked if (_resolver) (*_resolver)(reinterpret_cast(&_o->non_owning_reference), static_cast(_e)); else _o->non_owning_reference = nullptr; }; diff --git a/tests/test_builder.cpp b/tests/test_builder.cpp index 51b30c610..2c1e823c7 100644 --- a/tests/test_builder.cpp +++ b/tests/test_builder.cpp @@ -1,3 +1,5 @@ +#include "flatbuffers/stl_emulation.h" + #include "monster_test_generated.h" #include "test_builder.h" @@ -12,13 +14,20 @@ struct OwnedAllocator : public flatbuffers::DefaultAllocator {}; class TestHeapBuilder : public flatbuffers::FlatBufferBuilder { private: + // clang-format off + #if !defined(FLATBUFFERS_CPP98_STL) TestHeapBuilder(const TestHeapBuilder &); TestHeapBuilder &operator=(const TestHeapBuilder &); + #endif // !defined(FLATBUFFERS_CPP98_STL) + // clang-format on public: TestHeapBuilder() : flatbuffers::FlatBufferBuilder(2048, new OwnedAllocator(), true) {} + // clang-format off + #if !defined(FLATBUFFERS_CPP98_STL) + // clang-format on TestHeapBuilder(TestHeapBuilder &&other) : FlatBufferBuilder(std::move(other)) { } @@ -26,6 +35,9 @@ public: FlatBufferBuilder::operator=(std::move(other)); return *this; } + // clang-format off + #endif // !defined(FLATBUFFERS_CPP98_STL) + // clang-format on }; // This class simulates flatbuffers::grpc::detail::SliceAllocatorMember @@ -49,12 +61,18 @@ public: Swap(other); } + // clang-format off + #if !defined(FLATBUFFERS_CPP98_STL) + // clang-format on GrpcLikeMessageBuilder &operator=(GrpcLikeMessageBuilder &&other) { // Construct temporary and swap idiom GrpcLikeMessageBuilder temp(std::move(other)); Swap(temp); return *this; } + // clang-format off + #endif // !defined(FLATBUFFERS_CPP98_STL) + // clang-format on void Swap(GrpcLikeMessageBuilder &other) { // No need to swap member_allocator_ because it's stateless. diff --git a/tests/test_builder.h b/tests/test_builder.h index 8d32890bd..76222a729 100644 --- a/tests/test_builder.h +++ b/tests/test_builder.h @@ -34,6 +34,9 @@ bool release_n_verify(flatbuffers::grpc::MessageBuilder &mbb, const std::string template struct BuilderTests { + // clang-format off + #if !defined(FLATBUFFERS_CPP98_STL) + // clang-format on static void empty_builder_movector_test() { Builder b1; size_t b1_size = b1.GetSize(); @@ -97,38 +100,6 @@ struct BuilderTests { TEST_EQ_FUNC(b1.GetSize(), 0); } - static void builder_swap_before_finish_test() { - Builder b1; - auto root_offset1 = populate1(b1); - auto size1 = b1.GetSize(); - Builder b2; - auto root_offset2 = populate2(b2); - auto size2 = b2.GetSize(); - b1.Swap(b2); - b1.Finish(root_offset2); - b2.Finish(root_offset1); - TEST_EQ_FUNC(b1.GetSize() > size2, true); - TEST_EQ_FUNC(b2.GetSize() > size1, true); - TEST_ASSERT_FUNC(release_n_verify(b1, m2_name, m2_color)); - TEST_ASSERT_FUNC(release_n_verify(b2, m1_name, m1_color)); - } - - static void builder_swap_after_finish_test() { - Builder b1; - auto root_offset1 = populate1(b1); - b1.Finish(root_offset1); - auto size1 = b1.GetSize(); - Builder b2; - auto root_offset2 = populate2(b2); - b2.Finish(root_offset2); - auto size2 = b2.GetSize(); - b1.Swap(b2); - TEST_EQ_FUNC(b1.GetSize(), size2); - TEST_EQ_FUNC(b2.GetSize(), size1); - TEST_ASSERT_FUNC(release_n_verify(b1, m2_name, m2_color)); - TEST_ASSERT_FUNC(release_n_verify(b2, m1_name, m1_color)); - } - static void builder_move_assign_after_release_test() { Builder b1; auto root_offset1 = populate1(b1); @@ -166,18 +137,59 @@ struct BuilderTests { TEST_ASSERT_FUNC(release_n_verify(b1, m2_name, m2_color)); TEST_EQ_FUNC(b2.GetSize(), 0); } + // clang-format off + #endif // !defined(FLATBUFFERS_CPP98_STL) + // clang-format on + + static void builder_swap_before_finish_test() { + Builder b1; + auto root_offset1 = populate1(b1); + auto size1 = b1.GetSize(); + Builder b2; + auto root_offset2 = populate2(b2); + auto size2 = b2.GetSize(); + b1.Swap(b2); + b1.Finish(root_offset2); + b2.Finish(root_offset1); + TEST_EQ_FUNC(b1.GetSize() > size2, true); + TEST_EQ_FUNC(b2.GetSize() > size1, true); + TEST_ASSERT_FUNC(release_n_verify(b1, m2_name, m2_color)); + TEST_ASSERT_FUNC(release_n_verify(b2, m1_name, m1_color)); + } + + static void builder_swap_after_finish_test() { + Builder b1; + auto root_offset1 = populate1(b1); + b1.Finish(root_offset1); + auto size1 = b1.GetSize(); + Builder b2; + auto root_offset2 = populate2(b2); + b2.Finish(root_offset2); + auto size2 = b2.GetSize(); + b1.Swap(b2); + TEST_EQ_FUNC(b1.GetSize(), size2); + TEST_EQ_FUNC(b2.GetSize(), size1); + TEST_ASSERT_FUNC(release_n_verify(b1, m2_name, m2_color)); + TEST_ASSERT_FUNC(release_n_verify(b2, m1_name, m1_color)); + } static void all_tests() { + // clang-format off + #if !defined(FLATBUFFERS_CPP98_STL) + // clang-format on empty_builder_movector_test(); nonempty_builder_movector_test(); builder_movector_before_finish_test(); builder_movector_after_finish_test(); builder_move_assign_before_finish_test(); builder_move_assign_after_finish_test(); - builder_swap_before_finish_test(); - builder_swap_after_finish_test(); builder_move_assign_after_release_test(); builder_move_assign_after_releaseraw_test(); + // clang-format off + #endif // !defined(FLATBUFFERS_CPP98_STL) + // clang-format on + builder_swap_before_finish_test(); + builder_swap_after_finish_test(); } }; @@ -225,6 +237,9 @@ struct BuilderReuseTests { } } + // clang-format off + #if !defined(FLATBUFFERS_CPP98_STL) + // clang-format on static void builder_reusable_after_release_and_move_assign_test(TestSelector selector) { if (!selector.count(REUSABLE_AFTER_RELEASE_AND_MOVE_ASSIGN)) { return; @@ -261,12 +276,21 @@ struct BuilderReuseTests { TEST_EQ_FUNC(b2.GetSize(), 0); } } + // clang-format off + #endif // !defined(FLATBUFFERS_CPP98_STL) + // clang-format on static void run_tests(TestSelector selector) { builder_reusable_after_release_test(selector); builder_reusable_after_releaseraw_test(selector); + // clang-format off + #if !defined(FLATBUFFERS_CPP98_STL) + // clang-format on builder_reusable_after_release_and_move_assign_test(selector); builder_reusable_after_releaseraw_and_move_assign_test(selector); + // clang-format off + #endif // !defined(FLATBUFFERS_CPP98_STL) + // clang-format on } };