1 /*
2  * SObjectizer-5
3  */
4 
5 /*!
6  * \since
7  * v.5.5.3
8  *
9  * \file
10  * \brief A collector for agent tuning options.
11  */
12 
13 #pragma once
14 
15 #include <so_5/subscription_storage_fwd.hpp>
16 #include <so_5/message_limit.hpp>
17 #include <so_5/priority.hpp>
18 
19 namespace so_5
20 {
21 
22 //
23 // agent_tuning_options_t
24 //
25 /*!
26  * \since
27  * v.5.5.3
28  *
29  * \brief A collector for agent tuning options.
30  */
31 class agent_tuning_options_t
32 	{
33 	public :
34 		agent_tuning_options_t() = default;
35 
36 		friend inline void
swap(so_5::agent_tuning_options_t & a,so_5::agent_tuning_options_t & b)37 		swap(
38 			so_5::agent_tuning_options_t & a,
39 			so_5::agent_tuning_options_t & b ) noexcept
40 			{
41 				using std::swap;
42 				swap( a.m_subscription_storage_factory,
43 						b.m_subscription_storage_factory );
44 				swap( a.m_message_limits, b.m_message_limits );
45 				swap( a.m_priority, b.m_priority );
46 			}
47 
48 		//! Set factory for subscription storage creation.
49 		agent_tuning_options_t &
subscription_storage_factory(subscription_storage_factory_t factory)50 		subscription_storage_factory(
51 			subscription_storage_factory_t factory )
52 			{
53 				m_subscription_storage_factory = std::move( factory );
54 
55 				return *this;
56 			}
57 
58 		const subscription_storage_factory_t &
query_subscription_storage_factory() const59 		query_subscription_storage_factory() const
60 			{
61 				return m_subscription_storage_factory;
62 			}
63 
64 		//! Default subscription storage factory.
65 		static subscription_storage_factory_t
default_subscription_storage_factory()66 		default_subscription_storage_factory()
67 			{
68 				return so_5::default_subscription_storage_factory();
69 			}
70 
71 		message_limit::description_container_t
giveout_message_limits()72 		giveout_message_limits()
73 			{
74 				return std::move( m_message_limits );
75 			}
76 
77 		template< typename... Args >
78 		agent_tuning_options_t &
message_limits(Args &&...args)79 		message_limits( Args &&... args )
80 			{
81 				message_limit::accept_indicators(
82 						m_message_limits,
83 						std::forward< Args >( args )... );
84 
85 				return *this;
86 			}
87 
88 		//! Set priority for agent.
89 		/*! \since
90 		 * v.5.5.8 */
91 
92 		agent_tuning_options_t &
priority(so_5::priority_t v)93 		priority( so_5::priority_t v )
94 			{
95 				m_priority = v;
96 				return *this;
97 			}
98 
99 		//! Get priority value.
100 		so_5::priority_t
query_priority() const101 		query_priority() const
102 			{
103 				return m_priority;
104 			}
105 
106 	private :
107 		subscription_storage_factory_t m_subscription_storage_factory =
108 				default_subscription_storage_factory();
109 
110 		message_limit::description_container_t m_message_limits;
111 
112 		//! Priority for agent.
113 		/*! \since
114 		 * v.5.5.8 */
115 
116 		so_5::priority_t m_priority = so_5::prio::default_priority;
117 	};
118 
119 } /* namespace so_5 */
120 
121