Contents:
Search: |
MonadsOverviewThe monads interface is useful in all kinds of ways, since monads are so fundamental to Emdros. C++ interface#include <monads.h> class BadMonadsException {}; class MonadSetElement { public: MonadSetElement(monad_m first, monad_m last); MonadSetElement(monad_m monad); monad_m first(void) const; // Gets the member variable monad_m last(void) const; // Gets the member variable void printConsole(EMdFOutput *pOut) const; void printXML(EMdFOutput *pOut) const; // Returns true on this and b having the same first_m and // this and b having the same last_m. bool equals(const MonadSetElement& b) const; // Returns true on this object being // "lexicographically" before other object. // That is, true if and only if // this->first_m < other.first_m // or (this->first_m == other.first_m // and // this->last_m < other.last_m) bool isBefore(const MonadSetElement& other) const; }; class SOMConstIterator { public: SOMConstIterator(); ~SOMConstIterator(); bool hasNext() const; // Is the iterator == end iterator? Doesn't alter iterator const MonadSetElement& next(); // Gets current and advances iterator afterwards const MonadSetElement& current(); // Gets current without altering iterator }; class SetOfMonads { public: monad_m first() const; // First in set monad_m last() const; // Last in set SOMConstIterator const_iterator() const; std::ostream& putme(std::ostream& s) const; void printConsole(EMdFOutput *pOut) const; void printXML(EMdFOutput *pOut) const; SetOfMonads() {}; /** Constructor from compact string. * * Constructs a set from a compact string. This would previously * have been gotten from SetOfMonads::toCompactString(). * * @param compactString The compact string to create from. */ SetOfMonads(const std::string& compactString) : m_first(MAX_MONAD), m_last(0) { fromCompactString(compactString); }; /** Constructor for singleton set. * * Constructs a set with (initially) only one monad, \p m. * * @param m The monad to add to the empty set. */ SetOfMonads(monad_m m) { add(m); }; /** Constructor for single range set. * * Constructs a set with (initially) a single range, from \p first * to \p last. * * @param first The first monad of the range to add to an empty set. * @param last The last monad of the range to add to an empty set. */ SetOfMonads(monad_m first, monad_m last) : m_first(first), m_last(last) { monad_ms.push_back(MonadSetElement(first,last)); }; ~SetOfMonads(); SetOfMonads& operator=(const SetOfMonads& som); // Not SWIG-wrapped std::string toString(void) const; // Get string-representation bool part_of(const SetOfMonads& other) const; void unionWith(const SetOfMonads& other); void difference(const SetOfMonads& other); static SetOfMonads intersect(const SetOfMonads& Aset, const SetOfMonads& Bset); void addMSE(MonadSetElement mse); void add(monad_m monad); void add(monad_m first, monad_m last); bool equals(SetOfMonads& other) const; // A proxy for operator== bool operator==(SetOfMonads& other) const; // Not SWIG-wrapped bool isMemberOf(monad_m m) const; bool isEmpty(void) const; void getMonad_mVector(std::vector<monad_m>& monad_vec) const; // Not SWIG-wrapped void getMonad_mList(std::list<monad_m>& monad_list) const; // Not SWIG-wrapped void getGapVector(std::vector<monad_m>& gap_vec) const; // Not SWIG-wrapped void removeMSE(const MonadSetElement& mse); bool gapExists(monad_m Sm, monad_m& m) const; // Gap exists in // set, starting at Sm, finishing at m void offset(monad_m m); // Add m to all mse's in set void clear(); // Make empty std::string toCompactString(void) const; void fromCompactString(const std::string& inStr); /** Check whether set is a singleton or single range. * * Returns true if there is only one MonadSetElement in the set. * This can be either a singleton or a single range. * * @return true if there is only one MonadSetElement, false if not. */ bool hasOnlyOneMSE(void) const; }; ExamplesA SetOfMonads can be used like this: // Declare and fill som with monads SetOfMonads som; som.add(1); // Now is { 1 } som.add(3,6); // Now is { 1, 3-6 } som.add(10,13) ; // Now is { 1, 3-6, 10-13 } // Get string representation std::string stringRepresentation = som.toString(); // Declare and fill som2 with monads SetOfMonads som2; som2.add(2,7); // Now is { 2-7 } // Declare and fill som3 with monads SetOfMonads som3; som3.add(2,4); // Now is { 2-4 } // Add the monads of som2 to som som.unionWith(som2) // som is now { 1-7, 10-13 } // Get set intersection of som and som3 SetOfMonads som4; som4 = SetOfMonads::intersect(som, som3); // som4 is now { 2-4 } // Subtract the monads of som2 from som som.difference(som2); // som is now { 10-13 } The SOMConstIterator can be used like this: SetOfMonads som; // Assumed to be initialized from somewhere SOMConstIterator sci = som.const_iterator(); while (sci.hasNext()) { MonadSetElement mse = sci.current(); // Process mse ... // Are there any left? if (sci.hasNext()) { // Do something if the just-processed mse is not the last } sci.next(); } // Or like this: SetOfMonads som; // Assumed to be initialized from somewhere SOMConstIterator sci = som.const_iterator(); while (sci.hasNext()) { MonadSetElement mse = sci.next(); // Process mse ... // Note how there is no si.next() again, since next() // first gets current element and then advances iterator. } |