/** \defgroup policy_group The Policy Framework
- \htmlonly
- <map name="socketPolicy">
- <area shape="rect" alt="SocketPolicy" href="structsenf_1_1SocketPolicy.html" title="SocketPolicy" coords="276,90,558,213" />
- <area shape="rect" alt="WritePolicyBase" href="structsenf_1_1WritePolicyBase.html" title="WritePolicyBase" coords="39,243,174,268" />
- <area shape="rect" alt="ReadPolicyBase" href="structsenf_1_1ReadPolicyBase.html" title="ReadPolicyBase" coords="42,204,174,231" />
- <area shape="rect" alt="CommunicationPolicyBase" href="structsenf_1_1CommunicationPolicyBase.html" title="CommunicationPolicyBase" coords="0,166,215,193" />
- <area shape="rect" alt="FramingPolicyBase" href="structsenf_1_1FramingPolicyBase.html" title="FramingPolicyBase" coords="30,129,185,155" />
- <area shape="rect" alt="AddressingPolicyBase" href="structsenf_1_1AddressingPolicyBase.html" title="AddressingPolicyBase" coords="17,90,200,116" />
- </map>
- <img src="SocketPolicy.png" border="0" alt="Socket Policy" usemap="#socketPolicy">
- \endhtmlonly
-
+ <div class="diamap" name="SocketPolicy">
+ <span coords="39,229,182,257">\ref WritePolicyBase</span>
+ <span coords="17,76,210,105">\ref AddressingPolicyBase</span>
+ <span coords="29,114,194,143">\ref FramingPolicyBase</span>
+ <span coords="368,0,463,28">\ref PolicyBase</span>
+ <span coords="275,2,691,185">\ref SocketPolicy</span>
+ <span coords="0,152,227,181">\ref CommunicationPolicyBase</span>
+ <span coords="41,191,180,219">\ref ReadPolicyBase</span>
+ </div>
+ \htmlonly <img src="SocketPolicy.png" border="0" alt="SocketPolicy" usemap="#SocketPolicy"> \endhtmlonly
+
\section policy_group_introduction Introduction to the Policy Framework
The policy framework conceptually implements a list of parallel inheritance hierarchies each
<dt><em>readPolicy</em></dt><dd>configures the readability of the socket</dd>
- <dt><em>writePolicy</em></dt><dd>configures the writability of the socket</dd>
+ <dt><em>writePolicy</em></dt><dd>configures the writability of the socket</dd></dl>
The template senf::SocketPolicy combines these policy axis to form a concrete socket policy. In
a concrete policy, each of these policy axis is assigned a value, the policy value. This value
from the axis base class <tt>FramingPolicyBase</tt>. This base class also doubles as
<tt>UnspecifiedFramingPolicy</tt> (which is just a typedef alias). If a policy axis is assigned
this Unspecified type, the axis is left unspecified, the concrete policy will be incomplete.
-
+
The senf::SocketPolicy template defines the behavior of a socket handle. The socket handle
instances do not implement any socket functionality themselves instead deferring the
implementation to the policy classes. The SocketHandle interface is therefore \e not implemented
meta-programming are needed. However, this information is only needed if you want to write new
policy classes or want to use the policy framework explicitly for your own involved
optimizations ... or if you are just plain curious :-)
-
+
In the following discussion we will use the following conventions:
\li \e Axis is one or \c AddressingPolicy, \c FramingPolicy, \c CommunicationPolicy, \c
ReadPolicy or \c WritePolicy
as base classes to build other policy classes.
*/
-#ifndef HH_SocketPolicy_
-#define HH_SocketPolicy_ 1
+#ifndef HH_SENF_Socket_SocketPolicy_
+#define HH_SENF_Socket_SocketPolicy_ 1
// Custom includes
*/
struct AddressingPolicyBase
{
- virtual ~AddressingPolicyBase() {}
+ virtual ~AddressingPolicyBase();
class Address { Address(); };
};
*/
struct FramingPolicyBase
{
- virtual ~FramingPolicyBase() {}
+ virtual ~FramingPolicyBase();
};
/** \brief Policy defining, how peers are selected
The \c listen member is straight forward. The \c accept() member must return a new file
descriptor (which will be used to create a new SocketHandle of the correct
- type).
+ type).
\note This Policy only has two meaningful states: ConnectedCommunicationPolicy and
UnconnectedCommunicationPolicy. It is probably not sensible to define a new
*/
struct CommunicationPolicyBase
{
- virtual ~CommunicationPolicyBase() {}
+ virtual ~CommunicationPolicyBase();
};
/** \brief Policy defining the readability
*/
struct ReadPolicyBase
{
- virtual ~ReadPolicyBase() {}
+ virtual ~ReadPolicyBase();
};
/** \brief Policy defining the writability
*/
struct WritePolicyBase
{
- virtual ~WritePolicyBase() {}
+ virtual ~WritePolicyBase();
};
// The implementation file will for each Policy declared above
information.
*/
AddressingPolicyBase const & theAddressingPolicy() const = 0;
+
+ virtual ~SocketPolicyBase();
};
/** \brief Collection of policy classes