Convert from NULL macro to nullptr.
[shibboleth/cpp-xmltooling.git] / xmltooling / util / Predicates.h
index 2453a62..3269231 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  Copyright 2001-2007 Internet2
+ *  Copyright 2001-2010 Internet2
  * 
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -48,7 +48,7 @@ namespace xmltooling {
          * 
          * @param xmlObject the object to examine
          */
-        bool operator()(const XMLObject* xmlObject) {
+        bool operator()(const XMLObject* xmlObject) const {
             return xmlObject ? (xmlObject->getElementQName() == m_q) : false;
         }
         
@@ -75,15 +75,41 @@ namespace xmltooling {
          * 
          * @param xmlObject the object to examine
          */
-        bool operator()(const XMLObject* xmlObject) {
-            const QName* xsitype = xmlObject ? xmlObject->getSchemaType() : NULL;
+        bool operator()(const XMLObject* xmlObject) const {
+            const QName* xsitype = xmlObject ? xmlObject->getSchemaType() : nullptr;
             return xsitype ? (*xsitype == m_q) : false;
         }
         
     private:
         const QName& m_q;
     };
-        
+
+    /**
+     * Template algorithm returns first pointer element from a container that matches a predicate.
+     *
+     * @param c read-only container of pointer-based objects
+     * @param p a predicate function
+     * @return  the first object in the container matching the predicate, or nullptr
+     */
+    template<typename Container, typename Predicate>
+    typename Container::value_type find_if(const Container& c, const Predicate& p) {
+        typename Container::const_iterator i = std::find_if(c.begin(), c.end(), p);
+        return (i!=c.end()) ? *i : nullptr;
+    }
+
+    /**
+     * Template algorithm returns first pointer element from a container that matches a predicate.
+     *
+     * @param c read-only container of pointer-based objects
+     * @param p a predicate function
+     * @return  the first object in the container matching the predicate, or nullptr
+     */
+    template<typename Container, typename Predicate>
+    typename Container::value_type find_if(Container& c, const Predicate& p) {
+        typename Container::iterator i = std::find_if(c.begin(), c.end(), p);
+        return (i!=c.end()) ? *i : nullptr;
+    }
+
 };
 
 #endif /* __xmltooling_predicates_h__ */