|
Boost : |
From: Ariel Badichi (abadichi_at_[hidden])
Date: 2005-12-12 12:09:37
Martin Bonner wrote:
>
> Has anybody got a "non-ignorable return" class that they could add to boost?
> (A class that encapsulates a return value whose destructor asserts/aborts if
> the return code has not been examined or deliberatedly ignored by the
> calling code.)
>
> It would be a natural for this sort of application, and would be a generally
> useful utility class.
>
Attached is a toy implementation for such a thing.
#ifndef TOY_INC_TEST_CHECKED_CODE_H
#define TOY_INC_TEST_CHECKED_CODE_H
#include <cassert>
#ifndef TOY_TEST_CHECKED_CODE_DEFAULT_FAIL_POLICY
#define TOY_TEST_CHECKED_CODE_DEFAULT_FAIL_POLICY assert_fail
#endif
#ifndef TOY_TEST_CHECKED_CODE_DEFAULT_CHECK_POLICY
#ifndef NDEBUG
#define TOY_TEST_CHECKED_CODE_DEFAULT_CHECK_POLICY flag_check
#else
#define TOY_TEST_CHECKED_CODE_DEFAULT_CHECK_POLICY no_check
#endif
#endif
namespace toy
{
class assert_fail
{
public:
static void fail() { assert(!"code wasn't tested"); }
};
class flag_check
{
protected:
flag_check() : m_check(false) {}
bool was_checked() const { return m_check; }
void check() const { m_check = true; }
private:
mutable bool m_check;
};
class no_check
{
protected:
static bool was_checked() { return true; }
static void check() {}
};
//
// FailPolicy shouldn't throw (it's used in the dtor)
//
template<
typename T,
typename FailPolicy = TOY_TEST_CHECKED_CODE_DEFAULT_FAIL_POLICY,
typename CheckPolicy = TOY_TEST_CHECKED_CODE_DEFAULT_CHECK_POLICY
>
class test_checked_code : public FailPolicy
, public CheckPolicy
{
public:
test_checked_code(T code) // implicit ctor
: m_code(code)
{
}
test_checked_code(const test_checked_code & other)
: m_code(other) // conversion
{
}
template<typename U, typename V, typename W>
test_checked_code(const test_checked_code<U, V, W> & other)
: m_code(static_cast<U>(other)) // conversion
{
}
~test_checked_code()
{
if (this->was_checked() == false)
this->fail();
}
operator T() const
{
this->check();
return m_code;
}
private:
test_checked_code & operator= (const test_checked_code &);
private:
T m_code;
};
}
#endif
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk