Source: SelfTestingObject.h
|
|
|
|
#ifndef SELFTESTINGOBJECT_H //estetään moninkertainen includointi
#define SELFTESTINGOBJECT_H
#include <cassert> //käytetään assert-makroja
#include <string>
#include <stdexcept>
#include <cstdio>
namespace NobelNS {
//käyttäjä perii abstraktin SelfTestingObject-luokan
class SelfTestingObject {
public:
virtual bool invariant() const = 0; //käyttäjä toteuttaa abstraktin rajapinnan
virtual ~SelfTestingObject() {}
};
class InvariantException : public std::runtime_error {
public:
InvariantException(std::string s, int line) : std::runtime_error(s+InvariantException::toString(line)) {}
virtual ~InvariantException() {}
private:
static std::string toString(int i) {
char buf[11];
snprintf(buf, 11, "%d", i);
return std::string(buf);
}
};
}
/*#define NDEBUG*/ //kun NDEBUG on määritelty, testausvaiheen assertit korvataan poikkeuksilla
/*#define OPTIMIZATION*/ //kun OPTIMIZATION on määritelty, kaikki tarkistukset poistetaan
//käytetään vain, jos on pakko optimoida
#ifndef NDEBUG //jos debuggaus on päällä käytetään assertteja
#define INV() assert(this->invariant())
#define TEST(boolean, exception) assert(boolean)
#define INVDB() assert(this->invariant())
#define TESTDB(boolean) assert(boolean)
#else //muuten heitetään poikkeuksia
#ifndef OPTIMIZATION //jos ei optimoida
#define INV() if (!this->invariant()) throw NobelNS::InvariantException(std::string()+"Class invariant failure! File: "+__FILE__+" line: ", __LINE__)
#define TEST(boolean, exception) if (!(boolean)) throw (exception)
#define INVDB()
#define TESTDB(boolean)
#else //jos optimoidaan, tarkistukset poistetaan
#define INV()
#define TEST(boolean, exception)
#define INVDB()
#define TESTDB(boolean)
#endif
#endif
/*Makroja INV() ja TEST(boolean, exception) käytetään esim. jälki- ja esiehtoina.
Niiden käyttö on suositeltavaa.
INVDB() ja TESTDB(boolean) sopivat aikaa vaativiin tarkistuksiin.*/
#endif
Generated by: hoppq@ilenkone on Tue Mar 20 23:14:05 2001, using kdoc 2.0a53. |