diff --git a/CMakeLists.txt b/CMakeLists.txt index 0496e3f3c..d33cf617c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -56,7 +56,7 @@ find_package(Threads) # Common configuration for all build modes. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wno-unused-parameter") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wno-unused-parameter -Werror -Woverloaded-virtual") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-omit-frame-pointer -momit-leaf-frame-pointer") # Configuration for Debug build mode. @@ -289,4 +289,18 @@ target_link_libraries( add_dependencies(tcpresumeserver gmock) +add_executable( + subscriber_non_payload + test/simple/SubscriberNonPayloadTest.cpp +) + +target_link_libraries( + subscriber_non_payload + ReactiveSocket + ${FOLLY_LIBRARIES} + ${CMAKE_THREAD_LIBS_INIT} +) + +add_dependencies(subscriber_non_payload ReactiveSocket ReactiveStreams) + # EOF diff --git a/src/mixins/MemoryMixin.h b/src/mixins/MemoryMixin.h index d668b7ce1..ba5bdb603 100644 --- a/src/mixins/MemoryMixin.h +++ b/src/mixins/MemoryMixin.h @@ -30,7 +30,7 @@ namespace reactivesocket { /// implicitly specified as virtual, depending on whether the Base class /// is implementing the (virtual) methods of the /// Subscription or the Subscriber interface. -template +template class MemoryMixin : public Base { static_assert( std::is_base_of::value, @@ -42,8 +42,8 @@ class MemoryMixin : public Base { ~MemoryMixin() {} /// @{ - /// Publisher - void subscribe(Subscriber& subscriber) { + /// Publisher + void subscribe(Subscriber& subscriber) { Base::incrementRefCount(); Base::subscribe(subscriber); } @@ -62,13 +62,13 @@ class MemoryMixin : public Base { /// @} /// @{ - /// Subscriber + /// Subscriber void onSubscribe(Subscription& subscription) { Base::incrementRefCount(); Base::onSubscribe(subscription); } - void onNext(Payload payload) { + void onNext(T payload) { Base::onNext(std::move(payload)); } @@ -126,10 +126,10 @@ class WithIntrusiveDeleter { } // namespace details -template +template Base& createManagedInstance(TArgs&&... args) { auto* instance = - new MemoryMixin::T>( + new MemoryMixin::T, T>( std::forward(args)...); return *instance; } diff --git a/test/simple/SubscriberNonPayloadTest.cpp b/test/simple/SubscriberNonPayloadTest.cpp new file mode 100644 index 000000000..cabebe51f --- /dev/null +++ b/test/simple/SubscriberNonPayloadTest.cpp @@ -0,0 +1,30 @@ +// Copyright 2004-present Facebook. All Rights Reserved. + +#include + +#include "src/ReactiveStreamsCompat.h" +#include "src/Payload.h" +#include "src/mixins/IntrusiveDeleter.h" +#include "src/mixins/MemoryMixin.h" + +using namespace reactivesocket; + +class Foo { + public: + explicit Foo(const std::string&) {} + }; + +class FooSubscriber : public IntrusiveDeleter, public Subscriber { + public: + ~FooSubscriber() override = default; + void onSubscribe(Subscription&) override {} + void onNext(Foo) override {} + void onComplete() override {} + void onError(folly::exception_wrapper) override {} +}; + +int main(int argc, char** argv) { + auto& m = createManagedInstance(); + m.onNext(Foo("asdf")); + return 0; +}