template <typename Object, typename Sequence>
class Merger { // generic Merger
protected: // local types
typedef typename Sequence::ObjectIterator ObjectIterator;
private: // member data
ObjectIterator iterA, iterB; // iterators for A and B
Object a, b; // current objects
public:
Merger() { } // constructor
// generic merge function
void merger(const Sequence& A, const Sequence& B, Sequence& C);
protected: // overridden functions
virtual void aIsLess(const Object& a, Sequence& C) = 0;
virtual void bothEqual(const Object& a, const Object& b, Sequence& C) = 0;
virtual void bIsLess(const Object& b, Sequence& C) = 0;
protected: // local utilitites
bool getFromA() { // get next from A
if (iterA.hasNext()) { a = iterA.next(); return true; }
return false;
}
bool getFromB() { // get next from B
if (iterB.hasNext()) { b = iterB.next(); return true; }
return false;
}
};