Code

remember sticky_zoom toggle button state
[inkscape.git] / src / dom / domptr.h
index bf54deaa2925d6b31554527aa93ad174c625fb23..aaf1220f3ed19be38b2ea5d1a0bd2db57907c557 100644 (file)
-#ifndef __DOMPTR_H__\r
-#define __DOMPTR_H__\r
-/**\r
- * Phoebe DOM Implementation.\r
- *\r
- * This is a C++ approximation of the W3C DOM model, which follows\r
- * fairly closely the specifications in the various .idl files, copies of\r
- * which are provided for reference.  Most important is this one:\r
- *\r
- * http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/idl-definitions.html\r
- * \r
- * More thorough explanations of the various classes and their algorithms\r
- * can be found there.\r
- *     \r
- *\r
- * Authors:\r
- *   Bob Jamison\r
- *\r
- * Copyright (C) 2006-2008 Bob Jamison\r
- *\r
- *  This library is free software; you can redistribute it and/or\r
- *  modify it under the terms of the GNU Lesser General Public\r
- *  License as published by the Free Software Foundation; either\r
- *  version 2.1 of the License, or (at your option) any later version.\r
- *\r
- *  This library is distributed in the hope that it will be useful,\r
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of\r
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
- *  Lesser General Public License for more details.\r
- *\r
- *  You should have received a copy of the GNU Lesser General Public\r
- *  License along with this library; if not, write to the Free Software\r
- *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\r
- *  \r
- * =======================================================================\r
- *  NOTES:\r
- * \r
- *  Notice that many of the classes defined here are pure virtual.  In other\r
- *  words, they are purely unimplemented interfaces.  For the implementations\r
- *  of them, look in domimpl.h and domimpl.cpp.\r
- *  \r
- *  Also, note that there is a domptr.cpp file that has a couple of necessary\r
- *  functions which cannot be in a .h file\r
- *             \r
- */\r
-\r
-#include <functional>\r
-\r
-namespace org\r
-{\r
-namespace w3c\r
-{\r
-namespace dom\r
-{\r
-\r
-\r
-\r
-/*#########################################################################\r
-## NodePtr\r
-#########################################################################*/\r
-\r
-/**\r
- * A simple Smart Pointer class that handles Nodes and all of its\r
- * descendants.  This is very similar to shared_ptr, but it is customized\r
- * to handle our needs. \r
- */ \r
-template<class T> class Ptr\r
-{\r
-public:\r
-\r
-    /**\r
-     * Simple constructor\r
-     */ \r
-    Ptr()\r
-        { _ref = 0; }\r
-\r
-    /**\r
-     * Constructor upon a reference\r
-     */ \r
-    template<class Y> Ptr(const Ptr<Y> &other)\r
-        {\r
-        _ref = other._ref;\r
-           incrementRefCount(_ref);\r
-        }\r
-\r
-    /**\r
-     * Constructor upon a reference\r
-     */ \r
-    Ptr(T * refArg, bool addRef = true)\r
-        {\r
-        _ref = refArg;\r
-        if(addRef)\r
-                   incrementRefCount(_ref);\r
-        }\r
-\r
-\r
-    /**\r
-     * Copy constructor\r
-     */ \r
-    Ptr(const Ptr &other)\r
-        {\r
-        _ref = other._ref;\r
-           incrementRefCount(_ref);\r
-        }\r
-\r
-    /**\r
-     * Destructor\r
-     */ \r
-    virtual ~Ptr()\r
-    {\r
-        decrementRefCount(_ref);\r
-    }\r
-\r
-\r
-    /**\r
-     * Assignment operator\r
-     */ \r
-    template<class Y> Ptr &operator=(const Ptr<Y> &other)\r
-        {\r
-        decrementRefCount(_ref);\r
-        _ref = other._ref;\r
-        incrementRefCount(_ref);\r
-        return *this;\r
-        }\r
-\r
-    /**\r
-     * Assignment operator\r
-     */ \r
-    Ptr &operator=(const Ptr &other)\r
-        {\r
-        decrementRefCount(_ref);\r
-        _ref = other._ref;\r
-        incrementRefCount(_ref);\r
-        return *this;\r
-        }\r
-\r
-    /**\r
-     * Assignment operator\r
-     */ \r
-    template<class Y> Ptr &operator=(Y * ref)\r
-        {\r
-        decrementRefCount(_ref);\r
-        _ref = ref;\r
-        incrementRefCount(_ref);\r
-        return *this;\r
-        }\r
-\r
-    /**\r
-     * Assignment operator\r
-     */ \r
-    template<class Y> Ptr &operator=(const Y * ref)\r
-        {\r
-        decrementRefCount(_ref);\r
-        _ref = (Y *) ref;\r
-        incrementRefCount(_ref);\r
-        return *this;\r
-        }\r
-\r
-    /**\r
-     * Return the reference\r
-     */ \r
-    T * get() const\r
-        {\r
-        return _ref;\r
-        }\r
-\r
-    /**\r
-     * Dereference operator\r
-     */ \r
-    T &operator*() const\r
-        {\r
-        return *_ref;\r
-        }\r
-\r
-    /**\r
-     * Point-to operator\r
-     */ \r
-    T *operator->() const\r
-        {\r
-        return _ref;\r
-        }\r
-\r
-    /**\r
-     * NOT bool operator.  How to check if we are null without a comparison\r
-     */             \r
-    bool operator! () const\r
-        {\r
-        return (_ref == 0);\r
-        }\r
-\r
-    /**\r
-     * Swap what I reference with the other guy\r
-     */             \r
-    void swap(Ptr &other)\r
-        {\r
-        T *tmp = _ref;\r
-        _ref = other._ref;\r
-        other._ref = tmp;\r
-        }\r
-\r
-    //The referenced item\r
-    T *_ref;\r
-};\r
-\r
-\r
-/**\r
- * Global definitions.  Many of these are used to mimic behaviour of\r
- * a real pointer \r
- */\r
-\r
-/**\r
- * Equality\r
- */ \r
-template<class T, class U> inline bool\r
-   operator==(const Ptr<T> &a, const Ptr<U> &b)\r
-{\r
-    return a.get() == b.get();\r
-}\r
-\r
-/**\r
- * Inequality\r
- */ \r
-template<class T, class U> inline bool\r
-     operator!=(const Ptr<T> &a, const Ptr<U> &b)\r
-{\r
-    return a.get() != b.get();\r
-}\r
-\r
-/**\r
- * Equality\r
- */ \r
-template<class T> inline bool\r
-     operator==(const Ptr<T> &a, T * b)\r
-{\r
-    return a.get() == b;\r
-}\r
-\r
-/**\r
- * Inequality\r
- */ \r
-template<class T> inline bool\r
-     operator!=(const Ptr<T> &a, T * b)\r
-{\r
-    return a.get() != b;\r
-}\r
-\r
-/**\r
- * Equality\r
- */ \r
-template<class T> inline bool\r
-     operator==(T * a, const Ptr<T> &b)\r
-{\r
-    return a == b.get();\r
-}\r
-\r
-/**\r
- * Inequality\r
- */ \r
-template<class T> inline bool\r
-     operator!=(T * a, const Ptr<T> &b)\r
-{\r
-    return a != b.get();\r
-}\r
-\r
-\r
-/**\r
- * Less than\r
- */ \r
-template<class T> inline bool\r
-     operator<(const Ptr<T> &a, const Ptr<T> &b)\r
-{\r
-    return std::less<T *>()(a.get(), b.get());\r
-}\r
-\r
-/**\r
- * Swap\r
- */ \r
-template<class T> void\r
-     swap(Ptr<T> &a, Ptr<T> &b)\r
-{\r
-    a.swap(b);\r
-}\r
-\r
-\r
-/**\r
- * Get the pointer globally, for <algo>\r
- */ \r
-template<class T> T * \r
-    get_pointer(const Ptr<T> &p)\r
-{\r
-    return p.get();\r
-}\r
-\r
-/**\r
- * Static cast\r
- */ \r
-template<class T, class U> Ptr<T>\r
-     static_pointer_cast(const Ptr<U> &p)\r
-{\r
-    return static_cast<T *>(p.get());\r
-}\r
-\r
-/**\r
- * Const cast\r
- */ \r
-template<class T, class U> Ptr<T>\r
-     const_pointer_cast(const Ptr<U> &p)\r
-{\r
-    return const_cast<T *>(p.get());\r
-}\r
-\r
-/**\r
- * Dynamic cast\r
- */ \r
-template<class T, class U> Ptr<T>\r
-     dynamic_pointer_cast(const Ptr<U> &p)\r
-{\r
-    return dynamic_cast<T *>(p.get());\r
-}\r
-\r
-\r
-\r
-}  //namespace dom\r
-}  //namespace w3c\r
-}  //namespace org\r
-\r
-\r
-#endif // __DOMPTR_H__\r
-\r
-\r
-/*#########################################################################\r
-## E N D    O F    F I L E\r
-#########################################################################*/\r
-\r
-\r
-\r
-\r
+#ifndef __DOMPTR_H__
+#define __DOMPTR_H__
+/**
+ * Phoebe DOM Implementation.
+ *
+ * This is a C++ approximation of the W3C DOM model, which follows
+ * fairly closely the specifications in the various .idl files, copies of
+ * which are provided for reference.  Most important is this one:
+ *
+ * http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/idl-definitions.html
+ * 
+ * More thorough explanations of the various classes and their algorithms
+ * can be found there.
+ *     
+ *
+ * Authors:
+ *   Bob Jamison
+ *
+ * Copyright (C) 2006-2008 Bob Jamison
+ *
+ *  This library is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Lesser General Public
+ *  License as published by the Free Software Foundation; either
+ *  version 2.1 of the License, or (at your option) any later version.
+ *
+ *  This library is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Lesser General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Lesser General Public
+ *  License along with this library; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *  
+ * =======================================================================
+ *  NOTES:
+ * 
+ *  Notice that many of the classes defined here are pure virtual.  In other
+ *  words, they are purely unimplemented interfaces.  For the implementations
+ *  of them, look in domimpl.h and domimpl.cpp.
+ *  
+ *  Also, note that there is a domptr.cpp file that has a couple of necessary
+ *  functions which cannot be in a .h file
+ *             
+ */
+
+#include <functional>
+
+namespace org
+{
+namespace w3c
+{
+namespace dom
+{
+
+
+
+/*#########################################################################
+## NodePtr
+#########################################################################*/
+
+/**
+ * A simple Smart Pointer class that handles Nodes and all of its
+ * descendants.  This is very similar to shared_ptr, but it is customized
+ * to handle our needs. 
+ */ 
+template<class T> class Ptr
+{
+public:
+
+    /**
+     * Simple constructor
+     */ 
+    Ptr()
+        { _ref = 0; }
+
+    /**
+     * Constructor upon a reference
+     */ 
+    template<class Y> Ptr(const Ptr<Y> &other)
+        {
+        _ref = other._ref;
+           incrementRefCount(_ref);
+        }
+
+    /**
+     * Constructor upon a reference
+     */ 
+    Ptr(T * refArg, bool addRef = true)
+        {
+        _ref = refArg;
+        if(addRef)
+                   incrementRefCount(_ref);
+        }
+
+
+    /**
+     * Copy constructor
+     */ 
+    Ptr(const Ptr &other)
+        {
+        _ref = other._ref;
+           incrementRefCount(_ref);
+        }
+
+    /**
+     * Destructor
+     */ 
+    virtual ~Ptr()
+    {
+        decrementRefCount(_ref);
+    }
+
+
+    /**
+     * Assignment operator
+     */ 
+    template<class Y> Ptr &operator=(const Ptr<Y> &other)
+        {
+        decrementRefCount(_ref);
+        _ref = other._ref;
+        incrementRefCount(_ref);
+        return *this;
+        }
+
+    /**
+     * Assignment operator
+     */ 
+    Ptr &operator=(const Ptr &other)
+        {
+        decrementRefCount(_ref);
+        _ref = other._ref;
+        incrementRefCount(_ref);
+        return *this;
+        }
+
+    /**
+     * Assignment operator
+     */ 
+    template<class Y> Ptr &operator=(Y * ref)
+        {
+        decrementRefCount(_ref);
+        _ref = ref;
+        incrementRefCount(_ref);
+        return *this;
+        }
+
+    /**
+     * Assignment operator
+     */ 
+    template<class Y> Ptr &operator=(const Y * ref)
+        {
+        decrementRefCount(_ref);
+        _ref = (Y *) ref;
+        incrementRefCount(_ref);
+        return *this;
+        }
+
+    /**
+     * Return the reference
+     */ 
+    T * get() const
+        {
+        return _ref;
+        }
+
+    /**
+     * Dereference operator
+     */ 
+    T &operator*() const
+        {
+        return *_ref;
+        }
+
+    /**
+     * Point-to operator
+     */ 
+    T *operator->() const
+        {
+        return _ref;
+        }
+
+    /**
+     * NOT bool operator.  How to check if we are null without a comparison
+     */             
+    bool operator! () const
+        {
+        return (_ref == 0);
+        }
+
+    /**
+     * Swap what I reference with the other guy
+     */             
+    void swap(Ptr &other)
+        {
+        T *tmp = _ref;
+        _ref = other._ref;
+        other._ref = tmp;
+        }
+
+    //The referenced item
+    T *_ref;
+};
+
+
+/**
+ * Global definitions.  Many of these are used to mimic behaviour of
+ * a real pointer 
+ */
+
+/**
+ * Equality
+ */ 
+template<class T, class U> inline bool
+   operator==(const Ptr<T> &a, const Ptr<U> &b)
+{
+    return a.get() == b.get();
+}
+
+/**
+ * Inequality
+ */ 
+template<class T, class U> inline bool
+     operator!=(const Ptr<T> &a, const Ptr<U> &b)
+{
+    return a.get() != b.get();
+}
+
+/**
+ * Equality
+ */ 
+template<class T> inline bool
+     operator==(const Ptr<T> &a, T * b)
+{
+    return a.get() == b;
+}
+
+/**
+ * Inequality
+ */ 
+template<class T> inline bool
+     operator!=(const Ptr<T> &a, T * b)
+{
+    return a.get() != b;
+}
+
+/**
+ * Equality
+ */ 
+template<class T> inline bool
+     operator==(T * a, const Ptr<T> &b)
+{
+    return a == b.get();
+}
+
+/**
+ * Inequality
+ */ 
+template<class T> inline bool
+     operator!=(T * a, const Ptr<T> &b)
+{
+    return a != b.get();
+}
+
+
+/**
+ * Less than
+ */ 
+template<class T> inline bool
+     operator<(const Ptr<T> &a, const Ptr<T> &b)
+{
+    return std::less<T *>()(a.get(), b.get());
+}
+
+/**
+ * Swap
+ */ 
+template<class T> void
+     swap(Ptr<T> &a, Ptr<T> &b)
+{
+    a.swap(b);
+}
+
+
+/**
+ * Get the pointer globally, for <algo>
+ */ 
+template<class T> T * 
+    get_pointer(const Ptr<T> &p)
+{
+    return p.get();
+}
+
+/**
+ * Static cast
+ */ 
+template<class T, class U> Ptr<T>
+     static_pointer_cast(const Ptr<U> &p)
+{
+    return static_cast<T *>(p.get());
+}
+
+/**
+ * Const cast
+ */ 
+template<class T, class U> Ptr<T>
+     const_pointer_cast(const Ptr<U> &p)
+{
+    return const_cast<T *>(p.get());
+}
+
+/**
+ * Dynamic cast
+ */ 
+template<class T, class U> Ptr<T>
+     dynamic_pointer_cast(const Ptr<U> &p)
+{
+    return dynamic_cast<T *>(p.get());
+}
+
+
+
+}  //namespace dom
+}  //namespace w3c
+}  //namespace org
+
+
+#endif // __DOMPTR_H__
+
+
+/*#########################################################################
+## E N D    O F    F I L E
+#########################################################################*/
+
+
+
+