diff --git a/ipaacalib/cpp/include/ipaaca/ipaaca-buffers.h b/ipaacalib/cpp/include/ipaaca/ipaaca-buffers.h index 89fece9af61cb05b54891232f4c95e0cf551d1a1..124cb192874c13855cca49c598d19ffc1e7f27fd 100644 --- a/ipaacalib/cpp/include/ipaaca/ipaaca-buffers.h +++ b/ipaacalib/cpp/include/ipaaca/ipaaca-buffers.h @@ -78,14 +78,20 @@ IPAACA_HEADER_EXPORT class BufferConfiguration//{{{ IPAACA_MEMBER_VAR_EXPORT std::string _channel; public: IPAACA_HEADER_EXPORT inline BufferConfiguration(const std::string basename) { _basename = basename; } - IPAACA_HEADER_EXPORT const std::string get_basename() const { return _basename; } - IPAACA_HEADER_EXPORT const std::vector<std::string> get_category_interests() const { return _category_interests; } - IPAACA_HEADER_EXPORT const std::string get_channel() const { return _channel; } + IPAACA_HEADER_EXPORT inline const std::string get_basename() const { return _basename; } + IPAACA_HEADER_EXPORT inline const std::vector<std::string> get_category_interests() const { return _category_interests; } + IPAACA_HEADER_EXPORT inline const std::string get_channel() const { return _channel; } + public: + // setters, initialization helpers + IPAACA_HEADER_EXPORT inline BufferConfiguration& set_basename(const std::string& basename) { _basename = basename; return *this; } + IPAACA_HEADER_EXPORT inline BufferConfiguration& add_category_interest(const std::string& category) { _category_interests.push_back(category); return *this; } + IPAACA_HEADER_EXPORT inline BufferConfiguration& set_channel(const std::string& channel) { _channel = channel; return *this; } };//}}} IPAACA_HEADER_EXPORT class BufferConfigurationBuilder: private BufferConfiguration//{{{ { public: + [[deprecated("Use setters in BufferConfiguration instead of the Builder")]] IPAACA_HEADER_EXPORT inline BufferConfigurationBuilder(const std::string basename):BufferConfiguration(basename) {} IPAACA_HEADER_EXPORT inline void set_basename(const std::string& basename) { @@ -125,184 +131,185 @@ IPAACA_HEADER_EXPORT class IUEventHandler {//{{{ typedef boost::shared_ptr<IUEventHandler> ptr; };//}}} - IPAACA_HEADER_EXPORT class Buffer { //: public boost::enable_shared_from_this<Buffer> {//{{{ - friend class IU; - friend class RemotePushIU; - friend class CallbackIUPayloadUpdate; - friend class CallbackIULinkUpdate; - friend class CallbackIUCommission; - friend class CallbackIUResendRequest; - protected: - //Lock _handler_lock; - IPAACA_MEMBER_VAR_EXPORT std::string _uuid; - IPAACA_MEMBER_VAR_EXPORT std::string _basename; - IPAACA_MEMBER_VAR_EXPORT std::string _unique_name; - IPAACA_MEMBER_VAR_EXPORT std::string _id_prefix; - IPAACA_MEMBER_VAR_EXPORT std::string _channel; - IPAACA_MEMBER_VAR_EXPORT std::vector<IUEventHandler::ptr> _event_handlers; - protected: - IPAACA_HEADER_EXPORT _IPAACA_ABSTRACT_ virtual void _publish_iu_resend(boost::shared_ptr<IU> iu, const std::string& hidden_scope_name) = 0; +IPAACA_HEADER_EXPORT class Buffer { //: public boost::enable_shared_from_this<Buffer> {//{{{ + friend class IU; + friend class RemotePushIU; + friend class CallbackIUPayloadUpdate; + friend class CallbackIULinkUpdate; + friend class CallbackIUCommission; + friend class CallbackIUResendRequest; + protected: + //Lock _handler_lock; + IPAACA_MEMBER_VAR_EXPORT std::string _uuid; + IPAACA_MEMBER_VAR_EXPORT std::string _basename; + IPAACA_MEMBER_VAR_EXPORT std::string _unique_name; + IPAACA_MEMBER_VAR_EXPORT std::string _id_prefix; + IPAACA_MEMBER_VAR_EXPORT std::string _channel; + IPAACA_MEMBER_VAR_EXPORT std::vector<IUEventHandler::ptr> _event_handlers; + protected: + IPAACA_HEADER_EXPORT _IPAACA_ABSTRACT_ virtual void _publish_iu_resend(boost::shared_ptr<IU> iu, const std::string& hidden_scope_name) = 0; - IPAACA_HEADER_EXPORT _IPAACA_ABSTRACT_ virtual void _send_iu_link_update(IUInterface* iu, bool is_delta, revision_t revision, const LinkMap& new_links, const LinkMap& links_to_remove, const std::string& writer_name="undef") = 0; - IPAACA_HEADER_EXPORT _IPAACA_ABSTRACT_ virtual void _send_iu_payload_update(IUInterface* iu, bool is_delta, revision_t revision, const std::map<std::string, PayloadDocumentEntry::ptr>& new_items, const std::vector<std::string>& keys_to_remove, const std::string& writer_name="undef") = 0; - IPAACA_HEADER_EXPORT _IPAACA_ABSTRACT_ virtual void _send_iu_commission(IUInterface* iu, revision_t revision, const std::string& writer_name="undef") = 0; - // IPAACA_HEADER_EXPORT _IPAACA_ABSTRACT_ virtual void _send_iu_resendrequest(IUInterface* iu, revision_t revision, const std::string& writer_name="undef") = 0; - IPAACA_HEADER_EXPORT void _allocate_unique_name(const std::string& basename, const std::string& function); - IPAACA_HEADER_EXPORT inline Buffer(const std::string& basename, const std::string& function) { - _allocate_unique_name(basename, function); - _channel = "default"; - } - IPAACA_HEADER_EXPORT void call_iu_event_handlers(boost::shared_ptr<IUInterface> iu, bool local, IUEventType event_type, const std::string& category); - public: - IPAACA_HEADER_EXPORT virtual inline ~Buffer() { } - IPAACA_HEADER_EXPORT inline const std::string& unique_name() { return _unique_name; } - IPAACA_HEADER_EXPORT void register_handler(IUEventHandlerFunction function, IUEventType event_mask, const std::set<std::string>& categories); - IPAACA_HEADER_EXPORT void register_handler(IUEventHandlerFunction function, IUEventType event_mask = IU_ALL_EVENTS, const std::string& category=""); - //_IPAACA_ABSTRACT_ virtual void add(boost::shared_ptr<IUInterface> iu) = 0; - IPAACA_HEADER_EXPORT _IPAACA_ABSTRACT_ virtual boost::shared_ptr<IUInterface> get(const std::string& iu_uid) = 0; - IPAACA_HEADER_EXPORT _IPAACA_ABSTRACT_ virtual std::set<boost::shared_ptr<IUInterface> > get_ius() = 0; + IPAACA_HEADER_EXPORT _IPAACA_ABSTRACT_ virtual void _send_iu_link_update(IUInterface* iu, bool is_delta, revision_t revision, const LinkMap& new_links, const LinkMap& links_to_remove, const std::string& writer_name="undef") = 0; + IPAACA_HEADER_EXPORT _IPAACA_ABSTRACT_ virtual void _send_iu_payload_update(IUInterface* iu, bool is_delta, revision_t revision, const std::map<std::string, PayloadDocumentEntry::ptr>& new_items, const std::vector<std::string>& keys_to_remove, const std::string& writer_name="undef") = 0; + IPAACA_HEADER_EXPORT _IPAACA_ABSTRACT_ virtual void _send_iu_commission(IUInterface* iu, revision_t revision, const std::string& writer_name="undef") = 0; +// IPAACA_HEADER_EXPORT _IPAACA_ABSTRACT_ virtual void _send_iu_resendrequest(IUInterface* iu, revision_t revision, const std::string& writer_name="undef") = 0; + IPAACA_HEADER_EXPORT void _allocate_unique_name(const std::string& basename, const std::string& function); + IPAACA_HEADER_EXPORT inline Buffer(const std::string& basename, const std::string& function) { + _allocate_unique_name(basename, function); + _channel = "default"; + } + IPAACA_HEADER_EXPORT void call_iu_event_handlers(boost::shared_ptr<IUInterface> iu, bool local, IUEventType event_type, const std::string& category); + public: + IPAACA_HEADER_EXPORT virtual inline ~Buffer() { } + IPAACA_HEADER_EXPORT inline const std::string& unique_name() { return _unique_name; } + IPAACA_HEADER_EXPORT void register_handler(IUEventHandlerFunction function, IUEventType event_mask, const std::set<std::string>& categories); + IPAACA_HEADER_EXPORT void register_handler(IUEventHandlerFunction function, IUEventType event_mask = IU_ALL_EVENTS, const std::string& category=""); + //_IPAACA_ABSTRACT_ virtual void add(boost::shared_ptr<IUInterface> iu) = 0; + IPAACA_HEADER_EXPORT _IPAACA_ABSTRACT_ virtual boost::shared_ptr<IUInterface> get(const std::string& iu_uid) = 0; + IPAACA_HEADER_EXPORT _IPAACA_ABSTRACT_ virtual std::set<boost::shared_ptr<IUInterface> > get_ius() = 0; - IPAACA_HEADER_EXPORT inline const std::string& channel() { return _channel; } - }; - //}}} + IPAACA_HEADER_EXPORT inline const std::string& channel() { return _channel; } +}; +//}}} - IPAACA_HEADER_EXPORT class OutputBuffer: public Buffer { //, public boost::enable_shared_from_this<OutputBuffer> {//{{{ - friend class IU; - friend class RemotePushIU; - friend class OutputBufferRsbAdaptor; - protected: - protected: - //OutputBufferRsbAdaptor _rsb; - IPAACA_MEMBER_VAR_EXPORT IUStore _iu_store; - IPAACA_MEMBER_VAR_EXPORT Lock _iu_id_counter_lock; +IPAACA_HEADER_EXPORT class OutputBuffer: public Buffer { //, public boost::enable_shared_from_this<OutputBuffer> {//{{{ + friend class IU; + friend class RemotePushIU; + friend class OutputBufferRsbAdaptor; + protected: + protected: + //OutputBufferRsbAdaptor _rsb; + IPAACA_MEMBER_VAR_EXPORT IUStore _iu_store; + IPAACA_MEMBER_VAR_EXPORT Lock _iu_id_counter_lock; #ifdef IPAACA_EXPOSE_FULL_RSB_API - protected: - IPAACA_MEMBER_VAR_EXPORT std::map<std::string, rsb::Informer<rsb::AnyType>::Ptr> _informer_store; - IPAACA_MEMBER_VAR_EXPORT rsb::patterns::ServerPtr _server; - IPAACA_HEADER_EXPORT rsb::Informer<rsb::AnyType>::Ptr _get_informer(const std::string& category); + protected: + IPAACA_MEMBER_VAR_EXPORT std::map<std::string, rsb::Informer<rsb::AnyType>::Ptr> _informer_store; + IPAACA_MEMBER_VAR_EXPORT rsb::patterns::ServerPtr _server; + IPAACA_HEADER_EXPORT rsb::Informer<rsb::AnyType>::Ptr _get_informer(const std::string& category); #endif - protected: - // informing functions - IPAACA_HEADER_EXPORT void _send_iu_link_update(IUInterface* iu, bool is_delta, revision_t revision, const LinkMap& new_links, const LinkMap& links_to_remove, const std::string& writer_name="undef") _IPAACA_OVERRIDE_; - IPAACA_HEADER_EXPORT void _publish_iu_resend(boost::shared_ptr<IU> iu, const std::string& hidden_scope_name) _IPAACA_OVERRIDE_; + protected: + // informing functions + IPAACA_HEADER_EXPORT void _send_iu_link_update(IUInterface* iu, bool is_delta, revision_t revision, const LinkMap& new_links, const LinkMap& links_to_remove, const std::string& writer_name="undef") _IPAACA_OVERRIDE_; + IPAACA_HEADER_EXPORT void _publish_iu_resend(boost::shared_ptr<IU> iu, const std::string& hidden_scope_name) _IPAACA_OVERRIDE_; - IPAACA_HEADER_EXPORT void _send_iu_payload_update(IUInterface* iu, bool is_delta, revision_t revision, const std::map<std::string, PayloadDocumentEntry::ptr>& new_items, const std::vector<std::string>& keys_to_remove, const std::string& writer_name="undef") _IPAACA_OVERRIDE_; - IPAACA_HEADER_EXPORT void _send_iu_commission(IUInterface* iu, revision_t revision, const std::string& writer_name) _IPAACA_OVERRIDE_; - //IPAACA_HEADER_EXPORT void _send_iu_resendrequest(IUInterface* iu, revision_t revision, const std::string& writer_name); - // remote access functions - // _remote_update_links(IULinkUpdate) - // _remote_update_payload(IUPayloadUpdate) - // _remote_commit(protobuf::IUCommission) - IPAACA_HEADER_EXPORT void _publish_iu(boost::shared_ptr<IU> iu); + IPAACA_HEADER_EXPORT void _send_iu_payload_update(IUInterface* iu, bool is_delta, revision_t revision, const std::map<std::string, PayloadDocumentEntry::ptr>& new_items, const std::vector<std::string>& keys_to_remove, const std::string& writer_name="undef") _IPAACA_OVERRIDE_; + IPAACA_HEADER_EXPORT void _send_iu_commission(IUInterface* iu, revision_t revision, const std::string& writer_name) _IPAACA_OVERRIDE_; + //IPAACA_HEADER_EXPORT void _send_iu_resendrequest(IUInterface* iu, revision_t revision, const std::string& writer_name); + // remote access functions + // _remote_update_links(IULinkUpdate) + // _remote_update_payload(IUPayloadUpdate) + // _remote_commit(protobuf::IUCommission) + IPAACA_HEADER_EXPORT void _publish_iu(boost::shared_ptr<IU> iu); - IPAACA_HEADER_EXPORT void _retract_iu(boost::shared_ptr<IU> iu); - protected: - IPAACA_HEADER_EXPORT OutputBuffer(const std::string& basename, const std::string& channel="default"); - IPAACA_HEADER_EXPORT void _initialize_server(); - public: - IPAACA_HEADER_EXPORT static boost::shared_ptr<OutputBuffer> create(const std::string& basename); - IPAACA_HEADER_EXPORT ~OutputBuffer() { - IPAACA_IMPLEMENT_ME - } - IPAACA_HEADER_EXPORT void add(boost::shared_ptr<IU> iu); - IPAACA_HEADER_EXPORT boost::shared_ptr<IU> remove(const std::string& iu_uid); - IPAACA_HEADER_EXPORT boost::shared_ptr<IU> remove(boost::shared_ptr<IU> iu); - IPAACA_HEADER_EXPORT boost::shared_ptr<IUInterface> get(const std::string& iu_uid) _IPAACA_OVERRIDE_; - IPAACA_HEADER_EXPORT std::set<boost::shared_ptr<IUInterface> > get_ius() _IPAACA_OVERRIDE_; - typedef boost::shared_ptr<OutputBuffer> ptr; - }; - //}}} + IPAACA_HEADER_EXPORT void _retract_iu(boost::shared_ptr<IU> iu); + protected: + IPAACA_HEADER_EXPORT OutputBuffer(const std::string& basename, const std::string& channel="default"); + IPAACA_HEADER_EXPORT void _initialize_server(); + public: + IPAACA_HEADER_EXPORT static boost::shared_ptr<OutputBuffer> create(const std::string& basename); + IPAACA_HEADER_EXPORT ~OutputBuffer() { + IPAACA_IMPLEMENT_ME + } + IPAACA_HEADER_EXPORT void add(boost::shared_ptr<IU> iu); + IPAACA_HEADER_EXPORT boost::shared_ptr<IU> remove(const std::string& iu_uid); + IPAACA_HEADER_EXPORT boost::shared_ptr<IU> remove(boost::shared_ptr<IU> iu); + IPAACA_HEADER_EXPORT boost::shared_ptr<IUInterface> get(const std::string& iu_uid) _IPAACA_OVERRIDE_; + IPAACA_HEADER_EXPORT std::set<boost::shared_ptr<IUInterface> > get_ius() _IPAACA_OVERRIDE_; + typedef boost::shared_ptr<OutputBuffer> ptr; +}; +//}}} - IPAACA_HEADER_EXPORT class InputBuffer: public Buffer { //, public boost::enable_shared_from_this<InputBuffer> {//{{{ - friend class IU; - friend class RemotePushIU; - friend class InputBufferRsbAdaptor; - //InputBufferRsbAdaptor _rsb; +IPAACA_HEADER_EXPORT class InputBuffer: public Buffer { //, public boost::enable_shared_from_this<InputBuffer> {//{{{ + friend class IU; + friend class RemotePushIU; + friend class InputBufferRsbAdaptor; + //InputBufferRsbAdaptor _rsb; #ifdef IPAACA_EXPOSE_FULL_RSB_API - protected: - IPAACA_MEMBER_VAR_EXPORT std::map<std::string, rsb::ListenerPtr> _listener_store; - IPAACA_MEMBER_VAR_EXPORT std::map<std::string, rsb::patterns::RemoteServerPtr> _remote_server_store; - IPAACA_MEMBER_VAR_EXPORT RemotePushIUStore _iu_store; // TODO genericize - IPAACA_HEADER_EXPORT rsb::patterns::RemoteServerPtr _get_remote_server(const std::string& unique_server_name); - IPAACA_HEADER_EXPORT rsb::ListenerPtr _create_category_listener_if_needed(const std::string& category); - IPAACA_HEADER_EXPORT void _handle_iu_events(rsb::EventPtr event); - IPAACA_HEADER_EXPORT void _trigger_resend_request(rsb::EventPtr event); + protected: + IPAACA_MEMBER_VAR_EXPORT std::map<std::string, rsb::ListenerPtr> _listener_store; + IPAACA_MEMBER_VAR_EXPORT std::map<std::string, rsb::patterns::RemoteServerPtr> _remote_server_store; + IPAACA_MEMBER_VAR_EXPORT RemotePushIUStore _iu_store; // TODO genericize + IPAACA_HEADER_EXPORT rsb::patterns::RemoteServerPtr _get_remote_server(const std::string& unique_server_name); + IPAACA_HEADER_EXPORT rsb::ListenerPtr _create_category_listener_if_needed(const std::string& category); + IPAACA_HEADER_EXPORT void _handle_iu_events(rsb::EventPtr event); + IPAACA_HEADER_EXPORT void _trigger_resend_request(rsb::EventPtr event); #endif - protected: - IPAACA_HEADER_EXPORT inline void _send_iu_link_update(IUInterface* iu, bool is_delta, revision_t revision, const LinkMap& new_links, const LinkMap& links_to_remove, const std::string& writer_name="undef") _IPAACA_OVERRIDE_ - { - IPAACA_WARNING("(ERROR) InputBuffer::_send_iu_link_update() should never be invoked") - } - IPAACA_HEADER_EXPORT inline void _publish_iu_resend(boost::shared_ptr<IU> iu, const std::string& hidden_scope_name) _IPAACA_OVERRIDE_ - { - IPAACA_WARNING("(ERROR) InputBuffer::_publish_iu_resend() should never be invoked") - } - IPAACA_HEADER_EXPORT inline void _send_iu_payload_update(IUInterface* iu, bool is_delta, revision_t revision, const std::map<std::string, PayloadDocumentEntry::ptr>& new_items, const std::vector<std::string>& keys_to_remove, const std::string& writer_name="undef") _IPAACA_OVERRIDE_ - { - IPAACA_WARNING("(ERROR) InputBuffer::_send_iu_payload_update() should never be invoked") - } - IPAACA_HEADER_EXPORT inline void _send_iu_commission(IUInterface* iu, revision_t revision, const std::string& writer_name="undef") _IPAACA_OVERRIDE_ - { - IPAACA_WARNING("(ERROR) InputBuffer::_send_iu_commission() should never be invoked") - } - /*IPAACA_HEADER_EXPORT inline void _send_iu_resendrequest(IUInterface* iu, revision_t revision, const std::string& writer_name="undef") - { - IPAACA_WARNING("(ERROR) InputBuffer::_send_iu_resendrequest() should never be invoked") - }*/ - protected: - IPAACA_HEADER_EXPORT InputBuffer(const BufferConfiguration& bufferconfiguration); - IPAACA_HEADER_EXPORT InputBuffer(const std::string& basename, const std::set<std::string>& category_interests); - IPAACA_HEADER_EXPORT InputBuffer(const std::string& basename, const std::vector<std::string>& category_interests); - IPAACA_HEADER_EXPORT InputBuffer(const std::string& basename, const std::string& category_interest1); - IPAACA_HEADER_EXPORT InputBuffer(const std::string& basename, const std::string& category_interest1, const std::string& category_interest2); - IPAACA_HEADER_EXPORT InputBuffer(const std::string& basename, const std::string& category_interest1, const std::string& category_interest2, const std::string& category_interest3); - IPAACA_HEADER_EXPORT InputBuffer(const std::string& basename, const std::string& category_interest1, const std::string& category_interest2, const std::string& category_interest3, const std::string& category_interest4); + protected: + IPAACA_HEADER_EXPORT inline void _send_iu_link_update(IUInterface* iu, bool is_delta, revision_t revision, const LinkMap& new_links, const LinkMap& links_to_remove, const std::string& writer_name="undef") _IPAACA_OVERRIDE_ + { + IPAACA_WARNING("(ERROR) InputBuffer::_send_iu_link_update() should never be invoked") + } + IPAACA_HEADER_EXPORT inline void _publish_iu_resend(boost::shared_ptr<IU> iu, const std::string& hidden_scope_name) _IPAACA_OVERRIDE_ + { + IPAACA_WARNING("(ERROR) InputBuffer::_publish_iu_resend() should never be invoked") + } + IPAACA_HEADER_EXPORT inline void _send_iu_payload_update(IUInterface* iu, bool is_delta, revision_t revision, const std::map<std::string, PayloadDocumentEntry::ptr>& new_items, const std::vector<std::string>& keys_to_remove, const std::string& writer_name="undef") _IPAACA_OVERRIDE_ + { + IPAACA_WARNING("(ERROR) InputBuffer::_send_iu_payload_update() should never be invoked") + } + IPAACA_HEADER_EXPORT inline void _send_iu_commission(IUInterface* iu, revision_t revision, const std::string& writer_name="undef") _IPAACA_OVERRIDE_ + { + IPAACA_WARNING("(ERROR) InputBuffer::_send_iu_commission() should never be invoked") + } + /*IPAACA_HEADER_EXPORT inline void _send_iu_resendrequest(IUInterface* iu, revision_t revision, const std::string& writer_name="undef") + { + IPAACA_WARNING("(ERROR) InputBuffer::_send_iu_resendrequest() should never be invoked") + }*/ + protected: + IPAACA_HEADER_EXPORT InputBuffer(const BufferConfiguration& bufferconfiguration); + IPAACA_HEADER_EXPORT InputBuffer(const std::string& basename, const std::set<std::string>& category_interests); + IPAACA_HEADER_EXPORT InputBuffer(const std::string& basename, const std::vector<std::string>& category_interests); + IPAACA_HEADER_EXPORT InputBuffer(const std::string& basename, const std::string& category_interest1); + IPAACA_HEADER_EXPORT InputBuffer(const std::string& basename, const std::string& category_interest1, const std::string& category_interest2); + IPAACA_HEADER_EXPORT InputBuffer(const std::string& basename, const std::string& category_interest1, const std::string& category_interest2, const std::string& category_interest3); + IPAACA_HEADER_EXPORT InputBuffer(const std::string& basename, const std::string& category_interest1, const std::string& category_interest2, const std::string& category_interest3, const std::string& category_interest4); - IPAACA_MEMBER_VAR_EXPORT bool triggerResend; + IPAACA_MEMBER_VAR_EXPORT bool triggerResend; - public: - IPAACA_HEADER_EXPORT void set_resend(bool resendActive); - IPAACA_HEADER_EXPORT bool get_resend(); - IPAACA_HEADER_EXPORT static boost::shared_ptr<InputBuffer> create(const BufferConfiguration& bufferconfiguration); - IPAACA_HEADER_EXPORT static boost::shared_ptr<InputBuffer> create(const std::string& basename, const std::set<std::string>& category_interests); - IPAACA_HEADER_EXPORT static boost::shared_ptr<InputBuffer> create(const std::string& basename, const std::vector<std::string>& category_interests); - IPAACA_HEADER_EXPORT static boost::shared_ptr<InputBuffer> create(const std::string& basename, const std::string& category_interest1); - IPAACA_HEADER_EXPORT static boost::shared_ptr<InputBuffer> create(const std::string& basename, const std::string& category_interest1, const std::string& category_interest2); - IPAACA_HEADER_EXPORT static boost::shared_ptr<InputBuffer> create(const std::string& basename, const std::string& category_interest1, const std::string& category_interest2, const std::string& category_interest3); - IPAACA_HEADER_EXPORT static boost::shared_ptr<InputBuffer> create(const std::string& basename, const std::string& category_interest1, const std::string& category_interest2, const std::string& category_interest3, const std::string& category_interest4); - IPAACA_HEADER_EXPORT ~InputBuffer() { - IPAACA_IMPLEMENT_ME - } - IPAACA_HEADER_EXPORT boost::shared_ptr<IUInterface> get(const std::string& iu_uid) _IPAACA_OVERRIDE_; - IPAACA_HEADER_EXPORT std::set<boost::shared_ptr<IUInterface> > get_ius() _IPAACA_OVERRIDE_; - typedef boost::shared_ptr<InputBuffer> ptr; - }; - //}}} + public: + IPAACA_HEADER_EXPORT void set_resend(bool resendActive); + IPAACA_HEADER_EXPORT bool get_resend(); + IPAACA_HEADER_EXPORT static boost::shared_ptr<InputBuffer> create(const BufferConfiguration& bufferconfiguration); + IPAACA_HEADER_EXPORT static boost::shared_ptr<InputBuffer> create(const std::string& basename, const std::set<std::string>& category_interests); + IPAACA_HEADER_EXPORT static boost::shared_ptr<InputBuffer> create(const std::string& basename, const std::vector<std::string>& category_interests); + IPAACA_HEADER_EXPORT static boost::shared_ptr<InputBuffer> create(const std::string& basename, const std::string& category_interest1); + IPAACA_HEADER_EXPORT static boost::shared_ptr<InputBuffer> create(const std::string& basename, const std::string& category_interest1, const std::string& category_interest2); + IPAACA_HEADER_EXPORT static boost::shared_ptr<InputBuffer> create(const std::string& basename, const std::string& category_interest1, const std::string& category_interest2, const std::string& category_interest3); + IPAACA_HEADER_EXPORT static boost::shared_ptr<InputBuffer> create(const std::string& basename, const std::string& category_interest1, const std::string& category_interest2, const std::string& category_interest3, const std::string& category_interest4); + IPAACA_HEADER_EXPORT ~InputBuffer() { + IPAACA_IMPLEMENT_ME + } + IPAACA_HEADER_EXPORT boost::shared_ptr<IUInterface> get(const std::string& iu_uid) _IPAACA_OVERRIDE_; + IPAACA_HEADER_EXPORT std::set<boost::shared_ptr<IUInterface> > get_ius() _IPAACA_OVERRIDE_; + typedef boost::shared_ptr<InputBuffer> ptr; +}; +//}}} - IPAACA_HEADER_EXPORT class IUPayloadUpdate {//{{{ - public: - IPAACA_MEMBER_VAR_EXPORT std::string uid; - IPAACA_MEMBER_VAR_EXPORT revision_t revision; - IPAACA_MEMBER_VAR_EXPORT std::string writer_name; - IPAACA_MEMBER_VAR_EXPORT bool is_delta; - IPAACA_MEMBER_VAR_EXPORT std::map<std::string, PayloadDocumentEntry::ptr> new_items; - IPAACA_MEMBER_VAR_EXPORT std::vector<std::string> keys_to_remove; - friend std::ostream& operator<<(std::ostream& os, const IUPayloadUpdate& obj); - typedef boost::shared_ptr<IUPayloadUpdate> ptr; - };//}}} +IPAACA_HEADER_EXPORT class IUPayloadUpdate {//{{{ + public: + IPAACA_MEMBER_VAR_EXPORT std::string uid; + IPAACA_MEMBER_VAR_EXPORT revision_t revision; + IPAACA_MEMBER_VAR_EXPORT std::string writer_name; + IPAACA_MEMBER_VAR_EXPORT bool is_delta; + IPAACA_MEMBER_VAR_EXPORT std::map<std::string, PayloadDocumentEntry::ptr> new_items; + IPAACA_MEMBER_VAR_EXPORT std::vector<std::string> keys_to_remove; + IPAACA_MEMBER_VAR_EXPORT std::string payload_type; // to handle legacy mode + friend std::ostream& operator<<(std::ostream& os, const IUPayloadUpdate& obj); + typedef boost::shared_ptr<IUPayloadUpdate> ptr; +};//}}} - IPAACA_HEADER_EXPORT class IULinkUpdate {//{{{ - public: - IPAACA_MEMBER_VAR_EXPORT std::string uid; - IPAACA_MEMBER_VAR_EXPORT revision_t revision; - IPAACA_MEMBER_VAR_EXPORT std::string writer_name; - IPAACA_MEMBER_VAR_EXPORT bool is_delta; - IPAACA_MEMBER_VAR_EXPORT std::map<std::string, std::set<std::string> > new_links; - IPAACA_MEMBER_VAR_EXPORT std::map<std::string, std::set<std::string> > links_to_remove; - friend std::ostream& operator<<(std::ostream& os, const IULinkUpdate& obj); - typedef boost::shared_ptr<IULinkUpdate> ptr; - };//}}} +IPAACA_HEADER_EXPORT class IULinkUpdate {//{{{ + public: + IPAACA_MEMBER_VAR_EXPORT std::string uid; + IPAACA_MEMBER_VAR_EXPORT revision_t revision; + IPAACA_MEMBER_VAR_EXPORT std::string writer_name; + IPAACA_MEMBER_VAR_EXPORT bool is_delta; + IPAACA_MEMBER_VAR_EXPORT std::map<std::string, std::set<std::string> > new_links; + IPAACA_MEMBER_VAR_EXPORT std::map<std::string, std::set<std::string> > links_to_remove; + friend std::ostream& operator<<(std::ostream& os, const IULinkUpdate& obj); + typedef boost::shared_ptr<IULinkUpdate> ptr; +};//}}} #endif diff --git a/ipaacalib/cpp/include/ipaaca/ipaaca-definitions.h b/ipaacalib/cpp/include/ipaaca/ipaaca-definitions.h index cf0ebe2dac5d19447800af4711a7e3d16fbb2411..d5b8b248bff02e022adc21cd9399ccb3f18e9882 100644 --- a/ipaacalib/cpp/include/ipaaca/ipaaca-definitions.h +++ b/ipaacalib/cpp/include/ipaaca/ipaaca-definitions.h @@ -226,6 +226,14 @@ IPAACA_HEADER_EXPORT class PayloadEntryProxyInvalidatedError: public Exception// _description = "PayloadEntryProxyInvalidatedError"; } };//}}} +IPAACA_HEADER_EXPORT class PayloadIteratorInvalidError: public Exception//{{{ +{ + public: + IPAACA_HEADER_EXPORT inline ~PayloadIteratorInvalidError() throw() { } + IPAACA_HEADER_EXPORT inline PayloadIteratorInvalidError() { //boost::shared_ptr<IU> iu) { + _description = "PayloadIteratorInvalidError"; + } +};//}}} /// Static library initialization IPAACA_HEADER_EXPORT class Initializer diff --git a/ipaacalib/cpp/include/ipaaca/ipaaca-forwards.h b/ipaacalib/cpp/include/ipaaca/ipaaca-forwards.h index 3eab6221174fadabf0a1af0924ed3df8f99ccf7f..ef2a4fabafdfda79b2a8f6c967bb7084c6e7b793 100644 --- a/ipaacalib/cpp/include/ipaaca/ipaaca-forwards.h +++ b/ipaacalib/cpp/include/ipaaca/ipaaca-forwards.h @@ -46,6 +46,7 @@ class PayloadDocumentEntry; class PayloadEntryProxy; class Payload; +class PayloadIterator; class IUInterface; class IU; class Message; diff --git a/ipaacalib/cpp/include/ipaaca/ipaaca-ius.h b/ipaacalib/cpp/include/ipaaca/ipaaca-ius.h index 03bd9a3531f5f49f4383f8ed5175933fc12b082f..eecdcfe2d2a1268168249e488e03c740e7a2ff29 100644 --- a/ipaacalib/cpp/include/ipaaca/ipaaca-ius.h +++ b/ipaacalib/cpp/include/ipaaca/ipaaca-ius.h @@ -51,7 +51,7 @@ IPAACA_HEADER_EXPORT class IUInterface {//{{{ IPAACA_MEMBER_VAR_EXPORT std::string _uid; IPAACA_MEMBER_VAR_EXPORT revision_t _revision; IPAACA_MEMBER_VAR_EXPORT std::string _category; - IPAACA_MEMBER_VAR_EXPORT std::string _payload_type; // default is "MAP" + IPAACA_MEMBER_VAR_EXPORT std::string _payload_type; // default is "JSON" (legacy said "MAP") IPAACA_MEMBER_VAR_EXPORT std::string _owner_name; IPAACA_MEMBER_VAR_EXPORT bool _committed; IPAACA_MEMBER_VAR_EXPORT bool _retracted; @@ -122,12 +122,12 @@ IPAACA_HEADER_EXPORT class IU: public IUInterface {//{{{ IPAACA_MEMBER_VAR_EXPORT Lock _revision_lock; protected: IPAACA_HEADER_EXPORT inline void _increase_revision_number() { _revision++; } - IPAACA_HEADER_EXPORT IU(const std::string& category, IUAccessMode access_mode=IU_ACCESS_PUSH, bool read_only=false, const std::string& payload_type="MAP" ); + IPAACA_HEADER_EXPORT IU(const std::string& category, IUAccessMode access_mode=IU_ACCESS_PUSH, bool read_only=false, const std::string& payload_type="JSON" ); public: IPAACA_HEADER_EXPORT inline ~IU() { //IPAACA_IMPLEMENT_ME } - IPAACA_HEADER_EXPORT static boost::shared_ptr<IU> create(const std::string& category, IUAccessMode access_mode=IU_ACCESS_PUSH, bool read_only=false, const std::string& payload_type="MAP" ); + IPAACA_HEADER_EXPORT static boost::shared_ptr<IU> create(const std::string& category, IUAccessMode access_mode=IU_ACCESS_PUSH, bool read_only=false, const std::string& payload_type="JSON" ); IPAACA_HEADER_EXPORT inline Payload& payload() _IPAACA_OVERRIDE_ { return _payload; } IPAACA_HEADER_EXPORT inline const Payload& const_payload() const _IPAACA_OVERRIDE_ { return _payload; } IPAACA_HEADER_EXPORT void commit() _IPAACA_OVERRIDE_; @@ -151,12 +151,12 @@ IPAACA_HEADER_EXPORT class Message: public IU {//{{{ friend class CallbackIUCommission; friend class CallbackIUResendRequest; protected: - IPAACA_HEADER_EXPORT Message(const std::string& category, IUAccessMode access_mode=IU_ACCESS_MESSAGE, bool read_only=true, const std::string& payload_type="MAP" ); + IPAACA_HEADER_EXPORT Message(const std::string& category, IUAccessMode access_mode=IU_ACCESS_MESSAGE, bool read_only=true, const std::string& payload_type="JSON" ); public: IPAACA_HEADER_EXPORT inline ~Message() { //IPAACA_IMPLEMENT_ME } - IPAACA_HEADER_EXPORT static boost::shared_ptr<Message> create(const std::string& category, IUAccessMode access_mode=IU_ACCESS_MESSAGE, bool read_only=true, const std::string& payload_type="MAP" ); + IPAACA_HEADER_EXPORT static boost::shared_ptr<Message> create(const std::string& category, IUAccessMode access_mode=IU_ACCESS_MESSAGE, bool read_only=true, const std::string& payload_type="JSON" ); protected: IPAACA_HEADER_EXPORT void _modify_links(bool is_delta, const LinkMap& new_links, const LinkMap& links_to_remove, const std::string& writer_name = "") _IPAACA_OVERRIDE_; IPAACA_HEADER_EXPORT void _modify_payload(bool is_delta, const std::map<std::string, PayloadDocumentEntry::ptr>& new_items, const std::vector<std::string>& keys_to_remove, const std::string& writer_name = "") _IPAACA_OVERRIDE_; diff --git a/ipaacalib/cpp/include/ipaaca/ipaaca-payload.h b/ipaacalib/cpp/include/ipaaca/ipaaca-payload.h index 415cc782eea4be472b50188c88d57be4ba2472e2..ee88c267e4cd7389926ef1ba6c921dc1e660ba77 100644 --- a/ipaacalib/cpp/include/ipaaca/ipaaca-payload.h +++ b/ipaacalib/cpp/include/ipaaca/ipaaca-payload.h @@ -168,6 +168,7 @@ IPAACA_HEADER_EXPORT class PayloadDocumentStore//{{{ }; //}}} */ + IPAACA_HEADER_EXPORT class Payload//{{{ { friend std::ostream& operator<<(std::ostream& os, const Payload& obj); @@ -180,6 +181,7 @@ IPAACA_HEADER_EXPORT class Payload//{{{ friend class MessageConverter; friend class CallbackIUPayloadUpdate; friend class PayloadEntryProxy; + friend class PayloadIterator; friend class FakeIU; protected: IPAACA_MEMBER_VAR_EXPORT std::string _owner_name; @@ -212,10 +214,40 @@ IPAACA_HEADER_EXPORT class Payload//{{{ protected: IPAACA_HEADER_EXPORT PayloadDocumentEntry::ptr get_entry(const std::string& k); // json, changed str to proxy here, too public: + [[deprecated("Use operator[] and operator std::string() instead")]] IPAACA_HEADER_EXPORT std::string get(const std::string& k); // DEPRECATED + protected: + IPAACA_MEMBER_VAR_EXPORT unsigned long internal_revision; + IPAACA_MEMBER_VAR_EXPORT inline void mark_revision_change() { internal_revision++; } + public: + IPAACA_HEADER_EXPORT inline bool revision_changed(unsigned long reference_revision) { return internal_revision != reference_revision; } + public: + IPAACA_HEADER_EXPORT PayloadIterator begin(); + IPAACA_HEADER_EXPORT PayloadIterator end(); typedef boost::shared_ptr<Payload> ptr; };//}}} +IPAACA_HEADER_EXPORT class PayloadIterator//{{{ +{ + friend class Payload; + friend std::ostream& operator<<(std::ostream& os, const PayloadIterator& iter); + protected: + IPAACA_MEMBER_VAR_EXPORT Payload* _payload; + IPAACA_MEMBER_VAR_EXPORT unsigned long reference_payload_revision; + IPAACA_MEMBER_VAR_EXPORT PayloadDocumentStore::iterator raw_iterator; + //IPAACA_MEMBER_VAR_EXPORT bool is_end; + protected: + IPAACA_HEADER_EXPORT PayloadIterator(Payload* payload, PayloadDocumentStore::iterator&& pl_iter ); //, bool is_end); + public: + IPAACA_HEADER_EXPORT PayloadIterator(const PayloadIterator& iter); + IPAACA_HEADER_EXPORT PayloadIterator& operator++(); + IPAACA_HEADER_EXPORT std::pair<std::string, PayloadEntryProxy> operator*(); + IPAACA_HEADER_EXPORT bool operator==(const PayloadIterator& ref); + IPAACA_HEADER_EXPORT bool operator!=(const PayloadIterator& ref); + // constructor to create a new top-most parent proxy (from a payload key) +}; +//}}} + IPAACA_HEADER_EXPORT class PayloadEntryProxy//{{{ { friend std::ostream& operator<<(std::ostream& os, const PayloadEntryProxy& proxy); diff --git a/ipaacalib/cpp/src/ipaaca-internal.cc b/ipaacalib/cpp/src/ipaaca-internal.cc index 140b82deba449d3d51fbf4673ac0b4943e3e5f92..d317850d9d02ef85de3b3fcafc3949da20aef17a 100644 --- a/ipaacalib/cpp/src/ipaaca-internal.cc +++ b/ipaacalib/cpp/src/ipaaca-internal.cc @@ -171,8 +171,16 @@ IPAACA_EXPORT std::string IUConverter::serialize(const AnnotatedData& data, std: for (auto& kv: obj->_payload._document_store) { protobuf::PayloadItem* item = pbo->add_payload(); item->set_key(kv.first); - item->set_value( kv.second->to_json_string_representation() ); - item->set_type("JSON"); + //item->set_value( kv.second->to_json_string_representation() ); + //item->set_type("JSON"); + if (obj->_payload_type=="JSON") { + item->set_value( kv.second->to_json_string_representation() ); + item->set_type("JSON"); + } else if ((obj->_payload_type=="MAP") || (obj->_payload_type=="STR")) { + // legacy mode + item->set_value( json_value_cast<std::string>(kv.second->document)); + item->set_type("STR"); + } } for (LinkMap::const_iterator it=obj->_links._links.begin(); it!=obj->_links._links.end(); ++it) { protobuf::LinkSet* links = pbo->add_links(); @@ -323,8 +331,16 @@ IPAACA_EXPORT std::string MessageConverter::serialize(const AnnotatedData& data, for (auto& kv: obj->_payload._document_store) { protobuf::PayloadItem* item = pbo->add_payload(); item->set_key(kv.first); - item->set_value( kv.second->to_json_string_representation() ); - item->set_type("JSON"); + //item->set_value( kv.second->to_json_string_representation() ); + //item->set_type("JSON"); + if (obj->_payload_type=="JSON") { + item->set_value( kv.second->to_json_string_representation() ); + item->set_type("JSON"); + } else if ((obj->_payload_type=="MAP") || (obj->_payload_type=="STR")) { + // legacy mode + item->set_value( json_value_cast<std::string>(kv.second->document)); + item->set_type("STR"); + } } for (LinkMap::const_iterator it=obj->_links._links.begin(); it!=obj->_links._links.end(); ++it) { protobuf::LinkSet* links = pbo->add_links(); @@ -453,8 +469,14 @@ IPAACA_EXPORT std::string IUPayloadUpdateConverter::serialize(const AnnotatedDat for (auto& kv: obj->new_items) { protobuf::PayloadItem* item = pbo->add_new_items(); item->set_key(kv.first); - item->set_value( kv.second->to_json_string_representation() ); - item->set_type("JSON"); + if (obj->payload_type=="JSON") { + item->set_value( kv.second->to_json_string_representation() ); + item->set_type("JSON"); + } else if ((obj->payload_type=="MAP") || (obj->payload_type=="STR")) { + // legacy mode + item->set_value( json_value_cast<std::string>(kv.second->document)); + item->set_type("STR"); + } } for (auto& key: obj->keys_to_remove) { pbo->add_keys_to_remove(key); diff --git a/ipaacalib/cpp/src/ipaaca-ius.cc b/ipaacalib/cpp/src/ipaaca-ius.cc index 2c4b0643d2728c65dc780153c264742c4eb2f4a1..fa28b852962fb319018ab6ef85a89271bec0cd9c 100644 --- a/ipaacalib/cpp/src/ipaaca-ius.cc +++ b/ipaacalib/cpp/src/ipaaca-ius.cc @@ -218,6 +218,7 @@ IPAACA_EXPORT void RemotePushIU::_modify_payload(bool is_delta, const std::map<s update->writer_name = _buffer->unique_name(); update->new_items = new_items; update->keys_to_remove = keys_to_remove; + update->payload_type = _payload_type; boost::shared_ptr<int> result = server->call<int>("updatePayload", update, IPAACA_REMOTE_SERVER_TIMEOUT); // TODO if (*result == 0) { throw IUUpdateFailedError(); diff --git a/ipaacalib/cpp/src/ipaaca-json.cc b/ipaacalib/cpp/src/ipaaca-json.cc index b15ed3fa4c4cb6ee9207e723ca4b57d3c0f7d2c4..199299670d1200071ceb87e8be01d5076c3be766 100644 --- a/ipaacalib/cpp/src/ipaaca-json.cc +++ b/ipaacalib/cpp/src/ipaaca-json.cc @@ -50,6 +50,8 @@ int fakeiu_main(int argc, char** argv) ipaaca::FakeIU::ptr iu = ipaaca::FakeIU::create(); iu->add_fake_payload_item("a", entry); + iu->payload()["b"] = "anotherValue"; + iu->payload()["c"] = "yetAnotherValue"; auto a = iu->payload()["a"]; //auto a0 = a[0]; @@ -130,11 +132,20 @@ int fakeiu_main(int argc, char** argv) std::cout << "(n/a)" << std::endl; } - std::cout << "Setting a value deep in the object:" << std::endl; - iu->payload()["a"][0] = "set by pep::op="; + std::cout << "Setting value [0] in the object:" << std::endl; + try { + iu->payload()["a"][0] = "set by pep::op="; + } catch (ipaaca::PayloadAddressingError& e) { + std::cout << " Error - the provided object was not a suitable array" << std::endl; + } //iu->payload()["a"]["A"] = "set by pep::op="; - std::cout << "Final payload (printed as strings):" << std::endl; + std::cout << "Printing final payload using PayloadIterator:" << std::endl; + for (auto it = iu->payload().begin(); it != iu->payload().end(); ++it) { + std::cout << " " << std::left << std::setw(15) << ((*it).first+": ") << (*it).second << std::endl; + } + + std::cout << "Final payload (cast to map, printed as strings):" << std::endl; std::map<std::string, std::string> pl_flat = iu->payload(); for (auto& kv: pl_flat) { std::cout << " " << std::left << std::setw(15) << (kv.first+": ") << kv.second << std::endl; diff --git a/ipaacalib/cpp/src/ipaaca-payload.cc b/ipaacalib/cpp/src/ipaaca-payload.cc index 3f3a190549e87e554c327889a4c6b6053fe0cee1..c82ab7943ac01c7bed8655c776f395992e6d0f61 100644 --- a/ipaacalib/cpp/src/ipaaca-payload.cc +++ b/ipaacalib/cpp/src/ipaaca-payload.cc @@ -626,6 +626,7 @@ IPAACA_EXPORT void Payload::_internal_set(const std::string& k, PayloadDocumentE _iu.lock()->_modify_payload(true, _new, _remove, writer_name ); IPAACA_INFO(" Setting local payload item \"" << k << "\" to " << v) _document_store[k] = v; + mark_revision_change(); } IPAACA_EXPORT void Payload::_internal_remove(const std::string& k, const std::string& writer_name) { IPAACA_INFO("") @@ -634,6 +635,7 @@ IPAACA_EXPORT void Payload::_internal_remove(const std::string& k, const std::st _remove.push_back(k); _iu.lock()->_modify_payload(true, _new, _remove, writer_name ); _document_store.erase(k); + mark_revision_change(); } IPAACA_EXPORT void Payload::_internal_replace_all(const std::map<std::string, PayloadDocumentEntry::ptr>& new_contents, const std::string& writer_name) { @@ -641,6 +643,7 @@ IPAACA_EXPORT void Payload::_internal_replace_all(const std::map<std::string, Pa std::vector<std::string> _remove; _iu.lock()->_modify_payload(false, new_contents, _remove, writer_name ); _document_store = new_contents; + mark_revision_change(); } IPAACA_EXPORT void Payload::_internal_merge(const std::map<std::string, PayloadDocumentEntry::ptr>& contents_to_merge, const std::string& writer_name) { @@ -650,6 +653,7 @@ IPAACA_EXPORT void Payload::_internal_merge(const std::map<std::string, PayloadD for (auto& kv: contents_to_merge) { _document_store[kv.first] = kv.second; } + mark_revision_change(); //_document_store.insert(contents_to_merge.begin(), contents_to_merge.end()); //for (std::map<std::string, std::string>::iterator it = contents_to_merge.begin(); it!=contents_to_merge.end(); i++) { // _store[it->first] = it->second; @@ -666,17 +670,62 @@ IPAACA_EXPORT std::string Payload::get(const std::string& k) { // DEPRECATED IPAACA_EXPORT void Payload::_remotely_enforced_wipe() { _document_store.clear(); + mark_revision_change(); } IPAACA_EXPORT void Payload::_remotely_enforced_delitem(const std::string& k) { _document_store.erase(k); + mark_revision_change(); } IPAACA_EXPORT void Payload::_remotely_enforced_setitem(const std::string& k, PayloadDocumentEntry::ptr entry) { - IPAACA_INFO("Setting payload entry for \"" << k <<"\" to " << entry) + //IPAACA_INFO("Setting payload entry for \"" << k <<"\" to " << entry) _document_store[k] = entry; + mark_revision_change(); +} +IPAACA_EXPORT PayloadIterator Payload::begin() +{ + return PayloadIterator(this, _document_store.begin()); +} +IPAACA_EXPORT PayloadIterator Payload::end() +{ + return PayloadIterator(this, _document_store.end()); } //}}} +IPAACA_EXPORT PayloadIterator::PayloadIterator(Payload* payload, PayloadDocumentStore::iterator&& ref_it) +: _payload(payload), reference_payload_revision(payload->internal_revision), raw_iterator(std::move(ref_it)) +{ +} +IPAACA_EXPORT PayloadIterator::PayloadIterator(const PayloadIterator& iter) +: _payload(iter._payload), reference_payload_revision(iter.reference_payload_revision), raw_iterator(iter.raw_iterator) +{ +} + +IPAACA_EXPORT PayloadIterator& PayloadIterator::operator++() +{ + if (_payload->revision_changed(reference_payload_revision)) throw PayloadIteratorInvalidError(); + ++raw_iterator; + return *this; +} + +IPAACA_EXPORT std::pair<std::string, PayloadEntryProxy> PayloadIterator::operator*() +{ + if (_payload->revision_changed(reference_payload_revision)) throw PayloadIteratorInvalidError(); + if (raw_iterator == _payload->_document_store.end()) throw PayloadIteratorInvalidError(); + return std::pair<std::string, PayloadEntryProxy>(raw_iterator->first, PayloadEntryProxy(_payload, raw_iterator->first)); +} + +IPAACA_EXPORT bool PayloadIterator::operator==(const PayloadIterator& ref) +{ + if (_payload->revision_changed(reference_payload_revision)) throw PayloadIteratorInvalidError(); + return (raw_iterator==ref.raw_iterator); +} +IPAACA_EXPORT bool PayloadIterator::operator!=(const PayloadIterator& ref) +{ + if (_payload->revision_changed(reference_payload_revision)) throw PayloadIteratorInvalidError(); + return (raw_iterator!=ref.raw_iterator); +} + } // of namespace ipaaca