1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
|
#ifndef INCLUDED_BOBCAT_BINOPSBASE_
#define INCLUDED_BOBCAT_BINOPSBASE_
#include <utility>
#include <istream>
#include <ostream>
namespace FBB
{
// The recursively defined BinopsBase0 class: receives so a static
// cast becomes available to reach the basic arithmetic classes
// The general declaration:
//
template <class Derived, int ...ops>
class BinopsBase0;
// The terminating definition:
//
template <class Derived>
class BinopsBase0<Derived>
{};
#include "mul.f"
#include "div.f"
#include "mod.f"
#include "add.f"
#include "sub.f"
#include "shl.f"
#include "shr.f"
#include "and.f"
#include "or.f"
#include "xor.f"
#include "insert.f"
#include "extract.f"
// The class BinopsBase befriends all arithmetic classes, and implements
// wrappers for the arithmetic functions potentially defined in
// Derived.
// The arithmetic classes call BinopsBase' functions, which in turn call
// Derived's functions. This way Derived only needs to implement the
// necessary functions. Since the other functions aren't called, they
// arent't instantiated so there are no linker-errors
//
template <class Derived, int ...ops>
class BinopsBase: public BinopsBase0<Derived, ops...>
{
#include "friends.f"
#include "wraps.f"
};
#include "inlines.f"
} // FBB
#endif
|