Update to 2.0.0 tree from current Fremantle build
[opencv] / 3rdparty / include / OpenEXR / ImfAttribute.h
diff --git a/3rdparty/include/OpenEXR/ImfAttribute.h b/3rdparty/include/OpenEXR/ImfAttribute.h
new file mode 100644 (file)
index 0000000..45d62ff
--- /dev/null
@@ -0,0 +1,422 @@
+///////////////////////////////////////////////////////////////////////////
+//
+// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas
+// Digital Ltd. LLC
+// 
+// All rights reserved.
+// 
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+// *       Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// *       Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// *       Neither the name of Industrial Light & Magic nor the names of
+// its contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission. 
+// 
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+///////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef INCLUDED_IMF_ATTRIBUTE_H
+#define INCLUDED_IMF_ATTRIBUTE_H
+
+//-----------------------------------------------------------------------------
+//
+//     class Attribute
+//
+//-----------------------------------------------------------------------------
+
+#include "IexBaseExc.h"
+#include <ImfIO.h>
+#include <ImfXdr.h>
+
+
+namespace Imf {
+
+
+class Attribute
+{
+  public:
+
+    //---------------------------
+    // Constructor and destructor
+    //---------------------------
+
+    Attribute ();
+    virtual ~Attribute ();
+
+
+    //-------------------------------
+    // Get this attribute's type name
+    //-------------------------------
+
+    virtual const char *       typeName () const = 0;
+
+
+    //------------------------------
+    // Make a copy of this attribute
+    //------------------------------
+
+    virtual Attribute *                copy () const = 0;
+
+
+    //----------------------------------------
+    // Type-specific attribute I/O and copying
+    //----------------------------------------
+
+    virtual void               writeValueTo (OStream &os,
+                                             int version) const = 0;
+
+    virtual void               readValueFrom (IStream &is,
+                                              int size,
+                                              int version) = 0;
+
+    virtual void               copyValueFrom (const Attribute &other) = 0;
+
+
+    //------------------
+    // Attribute factory
+    //------------------
+
+    static Attribute *         newAttribute (const char typeName[]);
+
+
+    //-----------------------------------------------------------
+    // Test if a given attribute type has already been registered
+    //-----------------------------------------------------------
+
+    static bool                        knownType (const char typeName[]);
+
+
+  protected:
+
+    //--------------------------------------------------
+    // Register an attribute type so that newAttribute()
+    // knows how to make objects of this type.
+    //--------------------------------------------------
+
+    static void                registerAttributeType (const char typeName[],
+                                              Attribute *(*newAttribute)());
+
+    //------------------------------------------------------
+    // Un-register an attribute type so that newAttribute()
+    // no longer knows how to make objects of this type (for
+    // debugging only).
+    //------------------------------------------------------
+
+    static void                unRegisterAttributeType (const char typeName[]);
+};
+
+
+//-------------------------------------------------
+// Class template for attributes of a specific type
+//-------------------------------------------------
+
+template <class T>
+class TypedAttribute: public Attribute
+{
+  public:
+
+    //----------------------------
+    // Constructors and destructor
+    //------------_---------------
+
+    TypedAttribute ();
+    TypedAttribute (const T &value);
+    TypedAttribute (const TypedAttribute<T> &other);
+    virtual ~TypedAttribute ();
+
+
+    //--------------------------------
+    // Access to the attribute's value
+    //--------------------------------
+
+    T &                                        value ();
+    const T &                          value () const;
+
+
+    //--------------------------------
+    // Get this attribute's type name.
+    //--------------------------------
+
+    virtual const char *               typeName () const;
+    
+
+    //---------------------------------------------------------
+    // Static version of typeName()
+    // This function must be specialized for each value type T.
+    //---------------------------------------------------------
+
+    static const char *                        staticTypeName ();
+    
+
+    //---------------------
+    // Make a new attribute
+    //---------------------
+
+    static Attribute *                 makeNewAttribute ();
+
+
+    //------------------------------
+    // Make a copy of this attribute
+    //------------------------------
+
+    virtual Attribute *                        copy () const;
+
+
+    //-----------------------------------------------------------------
+    // Type-specific attribute I/O and copying.
+    // Depending on type T, these functions may have to be specialized.
+    //-----------------------------------------------------------------
+
+    virtual void               writeValueTo (OStream &os,
+                                             int version) const;
+
+    virtual void               readValueFrom (IStream &is,
+                                              int size,
+                                              int version);
+
+    virtual void               copyValueFrom (const Attribute &other);
+
+
+    //------------------------------------------------------------
+    // Dynamic casts that throw exceptions instead of returning 0.
+    //------------------------------------------------------------
+
+    static TypedAttribute *            cast (Attribute *attribute);
+    static const TypedAttribute *      cast (const Attribute *attribute);
+    static TypedAttribute &            cast (Attribute &attribute);
+    static const TypedAttribute &      cast (const Attribute &attribute);
+
+
+    //---------------------------------------------------------------
+    // Register this attribute type so that Attribute::newAttribute()
+    // knows how to make objects of this type.
+    //
+    // Note that this function is not thread-safe because it modifies
+    // a global variable in the IlmIlm library.  A thread in a multi-
+    // threaded program may call registerAttributeType() only when no
+    // other thread is accessing any functions or classes in the
+    // IlmImf library.
+    //
+    //---------------------------------------------------------------
+
+    static void                                registerAttributeType ();
+
+
+    //-----------------------------------------------------
+    // Un-register this attribute type (for debugging only)
+    //-----------------------------------------------------
+
+    static void                                 unRegisterAttributeType ();
+
+
+  private:
+
+    T                                  _value;
+};
+
+
+//------------------------------------
+// Implementation of TypedAttribute<T>
+//------------------------------------
+
+template <class T>
+TypedAttribute<T>::TypedAttribute (): _value (T())
+{
+    // empty
+}
+
+
+template <class T>
+TypedAttribute<T>::TypedAttribute (const T &value): _value (value)
+{
+    // empty
+}
+
+
+template <class T>
+TypedAttribute<T>::TypedAttribute (const TypedAttribute<T> &other):
+    _value ()
+{
+    copyValueFrom (other);
+}
+
+
+template <class T>
+TypedAttribute<T>::~TypedAttribute ()
+{
+    // empty
+}
+
+
+template <class T>
+inline T &
+TypedAttribute<T>::value ()
+{
+    return _value;
+}
+
+
+template <class T>
+inline const T &
+TypedAttribute<T>::value () const
+{
+    return _value;
+}
+
+
+template <class T>
+const char *   
+TypedAttribute<T>::typeName () const
+{
+    return staticTypeName();
+}
+
+
+template <class T>
+Attribute *
+TypedAttribute<T>::makeNewAttribute ()
+{
+    return new TypedAttribute<T>();
+}
+
+
+template <class T>
+Attribute *
+TypedAttribute<T>::copy () const
+{
+    Attribute * attribute = new TypedAttribute<T>();
+    attribute->copyValueFrom (*this);
+    return attribute;
+}
+
+
+template <class T>
+void           
+TypedAttribute<T>::writeValueTo (OStream &os, int version) const
+{
+    Xdr::write <StreamIO> (os, _value);
+}
+
+
+template <class T>
+void           
+TypedAttribute<T>::readValueFrom (IStream &is, int size, int version)
+{
+    Xdr::read <StreamIO> (is, _value);
+}
+
+
+template <class T>
+void           
+TypedAttribute<T>::copyValueFrom (const Attribute &other)
+{
+    _value = cast(other)._value;
+}
+
+
+template <class T>
+TypedAttribute<T> *
+TypedAttribute<T>::cast (Attribute *attribute)
+{
+    TypedAttribute<T> *t =
+       dynamic_cast <TypedAttribute<T> *> (attribute);
+
+    if (t == 0)
+       throw Iex::TypeExc ("Unexpected attribute type.");
+
+    return t;
+}
+
+
+template <class T>
+const TypedAttribute<T> *
+TypedAttribute<T>::cast (const Attribute *attribute)
+{
+    const TypedAttribute<T> *t =
+       dynamic_cast <const TypedAttribute<T> *> (attribute);
+
+    if (t == 0)
+       throw Iex::TypeExc ("Unexpected attribute type.");
+
+    return t;
+}
+
+
+template <class T>
+inline TypedAttribute<T> &     
+TypedAttribute<T>::cast (Attribute &attribute)
+{
+    return *cast (&attribute);
+}
+
+
+template <class T>
+inline const TypedAttribute<T> &
+TypedAttribute<T>::cast (const Attribute &attribute)
+{
+    return *cast (&attribute);
+}
+
+
+template <class T>
+inline void
+TypedAttribute<T>::registerAttributeType ()
+{
+    Attribute::registerAttributeType (staticTypeName(), makeNewAttribute);
+}
+
+
+template <class T>
+inline void
+TypedAttribute<T>::unRegisterAttributeType ()
+{
+    Attribute::unRegisterAttributeType (staticTypeName());
+}
+
+
+} // namespace Imf
+
+#if defined(OPENEXR_DLL) && defined(_MSC_VER)
+    // Tell MS VC++ to disable "non dll-interface class used as base
+    // for dll-interface class" and "no suitable definition provided
+    // for explicit template"
+    #pragma warning (disable : 4275 4661)
+
+    #if defined (ILMIMF_EXPORTS)
+       #define IMF_EXPIMP_TEMPLATE
+    #else
+       #define IMF_EXPIMP_TEMPLATE extern
+    #endif
+
+    IMF_EXPIMP_TEMPLATE template class Imf::TypedAttribute<float>;
+    IMF_EXPIMP_TEMPLATE template class Imf::TypedAttribute<double>;
+
+    #pragma warning(default : 4251)
+    #undef EXTERN_TEMPLATE
+#endif
+
+// Metrowerks compiler wants the .cpp file inlined, too
+#ifdef __MWERKS__
+#include <ImfAttribute.cpp>
+#endif
+
+#endif