X-Git-Url: https://ruin.nu/git/?p=popboot.git;a=blobdiff_plain;f=action.h;h=40e2db3137e4481e7adcad2be73f3ec75ed8a0f2;hp=dd14e28798d0ab83b9370901085e983b1d570195;hb=HEAD;hpb=3dadaa088d9fff7ca05cbb297f3d7e88179faccb diff --git a/action.h b/action.h index dd14e28..40e2db3 100644 --- a/action.h +++ b/action.h @@ -4,29 +4,98 @@ #include #include #include +#include -typedef std::vector literals; -typedef std::vector > preconditionsVector; -typedef __gnu_cxx::hash_map effectsMap; +//! A list of strings, each string representing an effect. +typedef std::vector Literals; +//! A map, but really a list of pairs, the precondition as a string, and a bool, true if it's a hard precondition, otherwise false. +typedef __gnu_cxx::hash_map Preconditions; +//! A map from returnvalue of the execution to the effects achieved. +typedef __gnu_cxx::hash_map EffectsMap; +// These are needed to be able to use std::string as key in a hash_map. +namespace __gnu_cxx { + template< typename CharT, typename Traits, typename Alloc > + struct hash< std::basic_string > { + size_t operator()(const std::basic_string& s) const { + + const std::collate& c = std::use_facet< std::collate >(std::locale()); + + return c.hash(s.c_str(), s.c_str() + s.size()); + + } + + }; + + template< typename CharT, typename Traits, typename Alloc > + struct hash< const std::basic_string > { //yes you need this version aswell! + + size_t operator()(const std::basic_string& s) const { + + const std::collate& c = std::use_facet< std::collate >(std::locale()); + + return c.hash(s.c_str(), s.c_str() + s.size()); + } + + }; +}; + +/** + * This class holds the information associated with an action. + * This is the name, the preconditions, the executable and the effects. + */ class Action { public: - Action(std::string name, preconditionsVector preconditions, effectsMap effects); + /** + * Creates an action. + * @param name The name given to this action. + * @param preconditions The preconditions needed before execution of this action. + * @param executable The executable which will be executed. + * @param effects The effects which will be achieved after execution. + */ + Action(std::string name, const Preconditions& preconditions, std::string executable, const EffectsMap& effects); + + /** + * Creates a copy of the given action. + */ Action(const Action& action); + /** + * Creates an empty, non-functional, action. + */ Action(){}; - const literals& effects(int value) const; - const literals& preconditions() const; + + /** + * Returns the effects which will be achived if the action returns + * the input value. + */ + const Literals& effects(int value) const; + + /** + * Returns the preconditions needed before execution of this action. + */ + const Preconditions& preconditions() const; + /** + * Returns the name of this action. + */ const std::string& name() const; - bool nextExecutable(); + /** + * Executes this action. + * @return the returnvalue of the execution. Can be used to find out the effects achieved. + */ int execute() const; - void reset(); protected: - preconditionsVector::const_iterator _currentPrecondition; + //! The name of the action. std::string _name; - preconditionsVector _preconditions; - effectsMap _effects; - static const literals _empty; + //! The executable which can be executed. + std::string _executable; + //! The preconditions needed before execution. + Preconditions _preconditions; + //! The effects which can be achieved. + EffectsMap _effects; + //! An empty list of effects which will be returned if the returnvalue was not found in _effects. + static const Literals _empty; }; + #endif