/* * Copyright (c) 2019 PANTHEON.tech. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at: * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef EVENTRECIVERBASE_H #define EVENTRECIVERBASE_H #include #include class EventReceiverBase { public: virtual ~EventReceiverBase() {} }; template class EventReceiver : public virtual EventReceiverBase { public: virtual void receiveWriteEvent(T *psender) = 0; }; class EventSender { public: template void registerReciver(T *receiver) { pReceiver = receiver; } void registerStream(void *stream) { this->stream = stream; } void *getStream() { return stream; } template void sendEvent(T* pSender) { if (nullptr == pReceiver) { throw std::runtime_error("Receiver is not register."); } EventReceiver *pCastedReceiver = dynamic_cast*>(pReceiver); pCastedReceiver->receiveWriteEvent(pSender); } private: EventReceiverBase *pReceiver = nullptr; void *stream = nullptr; }; template class BaseSender : public virtual EventSender { public: void send() { sendEvent((T*) this); } }; #endif // EVENTRECIVERBASE_H