|
From: <ric...@us...> - 2011-11-04 00:53:55
|
Revision: 1171
http://loki-lib.svn.sourceforge.net/loki-lib/?rev=1171&view=rev
Author: rich_sposato
Date: 2011-11-04 00:53:49 +0000 (Fri, 04 Nov 2011)
Log Message:
-----------
Changed names to be more descriptive. Updated comments.
Modified Paths:
--------------
trunk/include/loki/Checker.h
Modified: trunk/include/loki/Checker.h
===================================================================
--- trunk/include/loki/Checker.h 2011-10-24 18:07:46 UTC (rev 1170)
+++ trunk/include/loki/Checker.h 2011-11-04 00:53:49 UTC (rev 1171)
@@ -60,13 +60,13 @@
- and determining which exception safety level a function provides.
@par Class & Data Invariants
- ContractChecker and StaticChecker define invariants as "expressions that are
- true for particular data". They call a function which returns true if all data
- are valid, and returns false if any datum is invalid. This is called the
- validator function, and the host class or function provides a pointer to it.
- The validator could also assert for any invariant which fails rather than
- return false. If the validator is a static member function, you can use it
- with checkers in any function, but especially standalone functions and class
+ ContractChecker and StaticChecker define invariants as "conditions that are
+ true for particular objects". They call a function which returns true if all
+ conditions are valid, and returns false if any condition is invalid. This is
+ called the validator function, and the host class or function provides a
+ pointer to it. The validator may assert for any invariant which fails rather
+ than return false. If the validator is a static member function, you can use
+ it with checkers in any function, but especially standalone functions and class
static functions. If the validator is a non-static member function, you can
use it only within non-static member functions.
@@ -92,22 +92,27 @@
@par Provided Exception Policies
Loki provides several exception policies for use with ContractChecker.
- - CheckForNoChangeOrThrow
+ - CheckForNoThrowOrChange
- CheckForNoThrow
+ - CheckForNoChangeOnThrow
- CheckForNoChange
- - CheckForEquality
- CheckForNothing
Loki also provides these two policies for StaticChecker.
- CheckStaticForNoThrow
- CheckStaticForNothing
- @par Writing Your Own Policies for ContractChecker
- Loki provides several exception policies for ContractChecker. These policies
- assert if an object changed or a function threw an exception. If you prefer
- policies that log failures to a file, send an email, file a bug report, pop-up
- a message box, notify your unit-test framework, or whatever else, you can
- easily write your own policies. Please follow these guidelines when writing
- your own policies:
+ @par Reasons to Write Your Own Policies for ContractChecker
+ Loki provides several exception policies for ContractChecker that assert if an
+ object changed or a function threw an exception. These are good reasons to
+ write your own policies:
+ - you want to log failures to a file,
+ - you want to create a bug report,
+ - you want to stop your unit-test framework,
+ - your classes don't have copy-constructors or equality operators,
+ - or whatever else.
+
+ @par Guidelines for Writing Your Own Policies for ContractChecker
+ Please follow these guidelines when writing your own policies:
- Each policy class must provide three public functions, a constructor, a destructor, and a Check function.
- The destructor could be implied. (Not actually written, and provided by the compiler.)
- The constructor and Check functions accept a pointer to const instance of the host class.
@@ -238,15 +243,16 @@
// ----------------------------------------------------------------------------
-template < class Host, class Memento > class CheckForNoChange;
+template < class Host, class Memento > class CheckForNoChangeOnThrow;
-/** @class CheckForNoChange
+/** @class CheckForNoChangeOnThrow
@par Exception Safety Level:
This exception-checking policy class for ContractChecker asserts only if a
copy of the host differs from the host object when an exception occurs. Host
classes can use this policy to show which member functions provide the strong
- exception guarantee.
+ exception guarantee. Such functions provide transaction semantics - either the
+ action succeeds or the object rollsback to its previous state.
@par Requirements:
This policy requires hosts to provide both the copy-constructor and the
@@ -254,11 +260,11 @@
*/
template < class Host >
-class CheckForNoChange< Host, void >
+class CheckForNoChangeOnThrow< Host, void >
{
public:
- inline explicit CheckForNoChange( const Host * host ) :
+ inline explicit CheckForNoChangeOnThrow( const Host * host ) :
m_compare( *host ) {}
inline bool Check( const Host * host ) const
@@ -274,11 +280,11 @@
};
template < class Host, class Memento >
-class CheckForNoChange
+class CheckForNoChangeOnThrow
{
public:
- inline explicit CheckForNoChange( const Host * host ) :
+ inline explicit CheckForNoChangeOnThrow( const Host * host ) :
m_compare( *host ) {}
inline bool Check( const Host * host ) const
@@ -295,9 +301,9 @@
// ----------------------------------------------------------------------------
-template < class Host, class Memento > class CheckForNoChangeOrThrow;
+template < class Host, class Memento > class CheckForNoThrowOrChange;
-/** @class CheckForNoChangeOrThrow
+/** @class CheckForNoThrowOrChange
This policy comes in two forms - one uses a memento, and one does not. The
memento form does not copy the host object, but stores info about the host in
a memento for later comparison with the host. The other form copies the host
@@ -315,11 +321,11 @@
*/
template < class Host, class Memento >
-class CheckForNoChangeOrThrow
+class CheckForNoThrowOrChange
{
public:
- inline explicit CheckForNoChangeOrThrow( const Host * host ) :
+ inline explicit CheckForNoThrowOrChange( const Host * host ) :
m_compare( *host ) {}
inline bool Check( const Host * host ) const
@@ -336,11 +342,11 @@
};
template < class Host >
-class CheckForNoChangeOrThrow< Host, void >
+class CheckForNoThrowOrChange< Host, void >
{
public:
- inline explicit CheckForNoChangeOrThrow( const Host * host ) :
+ inline explicit CheckForNoThrowOrChange( const Host * host ) :
m_compare( *host ) {}
inline bool Check( const Host * host ) const
@@ -358,9 +364,9 @@
// ----------------------------------------------------------------------------
-template < class Host, class Memento > class CheckForEquality;
+template < class Host, class Memento > class CheckForNoChange;
-/** @class CheckForEquality
+/** @class CheckForNoChange
@par Exception Safety Level:
This exception-checking policy class for ContractChecker asserts if a copy of
@@ -378,11 +384,11 @@
*/
template < class Host, class Memento >
-class CheckForEquality
+class CheckForNoChange
{
public:
- inline explicit CheckForEquality( const Host * host ) :
+ inline explicit CheckForNoChange( const Host * host ) :
m_compare( *host ) {}
inline bool Check( const Host * host ) const
@@ -397,11 +403,11 @@
};
template < class Host >
-class CheckForEquality< Host, void >
+class CheckForNoChange< Host, void >
{
public:
- inline explicit CheckForEquality( const Host * host ) :
+ inline explicit CheckForNoChange( const Host * host ) :
m_compare( *host ) {}
inline bool Check( const Host * host ) const
@@ -468,18 +474,18 @@
-# Add one of these lines at the top of various class member functions to
construct a checker near the top of each public function. You may also pass
in pointers to functions which check pre- and post-conditions.
- - CheckFor::NoChangeOrThrow checker( this, &Host::IsValid );
+ - CheckFor::NoThrowOrChange checker( this, &Host::IsValid );
+ - CheckFor::NoChangeOnThrow checker( this, &Host::IsValid );
- CheckFor::NoThrow checker( this, &Host::IsValid );
- CheckFor::NoChange checker( this, &Host::IsValid );
- - CheckFor::Equality checker( this, &Host::IsValid );
- CheckFor::Invariants checker( this, &Host::IsValid );
-# Use these guidelines to decide which policy to use inside which function:
- If the function never throws, then use the CheckForNoThrow policy.
- - If the function never changes any data members, then use CheckForEquality
+ - If the function never changes any data members, then use CheckForNoChange
policy.
- If the function's normal execution flow changes data, but must make sure
data remains unchanged when any exceptions occur, then use the
- CheckForNoChange policy.
+ CheckForNoChangeOnThrow policy.
- Otherwise use the CheckInvariants policy.
-# Recompile a debug version of your program, run the program and all the unit
tests, and look for which assertions failed.
@@ -569,10 +575,10 @@
/// Pointer to member function that checks Host object's invariants.
Validator m_validator;
- /// Pointer to member function that checks Host object's pre-conditions.
+ /// Pointer to member function that checks Host function's pre-conditions.
Validator m_pre;
- /// Pointer to member function that checks Host object's post-conditions.
+ /// Pointer to member function that checks Host function's post-conditions.
Validator m_post;
};
@@ -590,10 +596,10 @@
struct CheckFor
{
// These lines declare checkers for non-static functions in a host class.
- typedef ContractChecker< Host, CheckForNoChangeOrThrow, Memento > NoChangeOrThrow;
+ typedef ContractChecker< Host, CheckForNoThrowOrChange, Memento > NoThrowOrChange;
+ typedef ContractChecker< Host, CheckForNoChangeOnThrow, Memento > NoChangeOnThrow;
typedef ContractChecker< Host, CheckForNoThrow, Memento > NoThrow;
typedef ContractChecker< Host, CheckForNoChange, Memento > NoChange;
- typedef ContractChecker< Host, CheckForEquality, Memento > Equality;
typedef ContractChecker< Host, CheckForNothing, Memento > Invariants;
};
@@ -745,10 +751,10 @@
/// Pointer to member function that checks Host object's invariants.
Validator m_validator;
- /// Pointer to member function that checks Host object's pre-conditions.
+ /// Pointer to member function that checks Host function's pre-conditions.
Validator m_pre;
- /// Pointer to member function that checks Host object's post-conditions.
+ /// Pointer to member function that checks Host function's post-conditions.
Validator m_post;
};
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|