00001
00002 #ifndef MIX_FUNCTIONS_H_
00003 #define MIX_FUNCTIONS_H_
00004
00005 #include "misc.h"
00006 #include "extern/compose.hpp"
00007
00008 #include <functional>
00009
00014 namespace MiX{
00015 template <class charT,class char_traits,class xml_traits>
00016 class NodeTypeChecker
00017 : public std::unary_function<const Node<charT,char_traits,xml_traits>*,bool>{
00018 public:
00019 MiX_Template_Typedef(charT,char_traits,xml_traits);
00020 typedef const Node<charT,char_traits,xml_traits>* argument_type;
00021 typedef bool result_type;
00022 private:
00023 NodeType type_;
00024 public:
00026 NodeTypeChecker(NodeType t) : type_(t){ };
00028 result_type operator()(argument_type node)const{
00029 return (node->getType()==type_);
00030 };
00031 };
00032
00033 template <class charT,class char_traits,class xml_traits>
00034 class NodeNameChecker
00035 : public std::unary_function<const Node<charT,char_traits,xml_traits>*,bool>{
00036 public:
00037 MiX_Template_Typedef(charT,char_traits,xml_traits);
00038 typedef const node_type* argument_type;
00039 typedef bool result_type;
00040 private:
00041 string_type name_,ns_;
00042 public:
00044 NodeNameChecker(const string_type& name,string_type ns = string_type())
00045 : name_(name), ns_(ns) { };
00047 result_type operator()(argument_type node)const;
00048 };
00049
00050 template <class nodeT>
00051 class NamedNodeFinder
00052 : public std::unary_function<bool,Node<typename nodeT::char_type,
00053 typename nodeT::char_traits_type,
00054 typename nodeT::xml_traits_type>*> {
00055 public:
00056 typedef typename nodeT::char_type charT;
00057 typedef typename nodeT::char_traits_type char_traits;
00058 typedef typename nodeT::xml_traits_type xml_traits;
00059
00060 MiX_Template_Typedef(charT,char_traits,xml_traits);
00061 typedef const node_type* argument_type;
00062 typedef bool result_type;
00063 bool use_ns_;
00064 string_type name_,url_;
00065
00066 public:
00074 NamedNodeFinder(const string_type& name,const string_type& ns)
00075 { name_ = name; url_ = ns; use_ns_ = true; }
00076
00083 NamedNodeFinder(const string_type& name) { name_ = name; use_ns_ = false; }
00084
00086 bool operator()(argument_type node){
00087 if( node->getType()==nodeT::type() ) {
00088 const namednode_type* named=dynamic_cast<const namednode_type*>(node);
00089 if( !named ) return false;
00090 if( use_ns_ ) {
00091 if( named->getName()==name_ && named->getURI()==url_ ) return true;
00092 } else {
00093 if( named->getFullName()==name_ ) return true;
00094 }
00095 }
00096 return false;
00097 }
00098 };
00099 }
00100
00101 #ifndef MIX_FUNCTIONS_CPP_
00102 #include "Functions.cpp"
00103 #endif
00104
00105 #endif