#define __SORTACTION_H__
#include <tr1/memory>
+#include <string>
class GeneOrder;
+
+
+/**
+ * Abstraction for a sort action implementation, this is the base that other
+ * actions inherits from.
+ */
+class SortActionImpl{
+ public:
+
+ virtual ~SortActionImpl(){};
+
+ /**
+ * Applies the action on the GeneOrder and returning it.
+ */
+ virtual GeneOrder& operator()(GeneOrder& go) const = 0;
+
+ /**
+ * Compares sort actions.
+ */
+ virtual bool operator==(const SortActionImpl& sa) const = 0;
+
+ /**
+ * Gives a string representation of the action, for output
+ */
+ virtual std::string toString() const = 0;
+};
+
/**
- * Abstraction of a sort action, all child actions has to be immutable.
+ * Abstraction of a sort action, all SortActionImpls has to be immutable.
*
* \author Michael Andreen
*/
class SortAction{
public:
- typedef std::tr1::shared_ptr<SortAction> ActionPointer;
+ typedef std::tr1::shared_ptr<SortActionImpl> ActionPointer;
/**
* Creates a new sort action, given a specified action.
* SortAction promises to remove the given action.
*/
- SortAction(SortAction* sa): _action(sa){
+ SortAction(SortActionImpl* sa): _action(sa){
}
SortAction(const SortAction& sa): _action(sa._action){
}
- virtual const SortAction& operator=(const SortAction& sa){
+ const SortAction& operator=(const SortAction& sa){
if (this != &sa)
_action = sa._action;
return *this;
}
- virtual ~SortAction(){};
+ ~SortAction(){};
/**
* Applies the action on the GeneOrder and returning it.
*/
- virtual GeneOrder& operator()(GeneOrder& go) const{
+ GeneOrder& operator()(GeneOrder& go) const{
return (*_action)(go);
}
/**
* Compares sort actions.
*/
- virtual bool operator==(const SortAction& sa) const{
- return (*_action) == (sa._action.get() == 0 ? sa : *sa._action);
+ bool operator==(const SortAction& sa) const{
+ return (*_action) == (*sa._action);
+ }
+
+ /**
+ * Compares sort actions.
+ */
+ bool operator==(const SortActionImpl& sa) const{
+ return (*_action) == sa;
+ }
+
+ /**
+ * Gives a string representation of the action, for output
+ */
+ std::string toString() const{
+ return _action->toString();
+ }
+
+ /**
+ * Gives access to the implementation
+ */
+ const SortActionImpl& impl() const{
+ return *_action;
}
private:
ActionPointer _action;