Blame IlmImf/ImfAttribute.h

Packit Service 6754ca
///////////////////////////////////////////////////////////////////////////
Packit Service 6754ca
//
Packit Service 6754ca
// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas
Packit Service 6754ca
// Digital Ltd. LLC
Packit Service 6754ca
// 
Packit Service 6754ca
// All rights reserved.
Packit Service 6754ca
// 
Packit Service 6754ca
// Redistribution and use in source and binary forms, with or without
Packit Service 6754ca
// modification, are permitted provided that the following conditions are
Packit Service 6754ca
// met:
Packit Service 6754ca
// *       Redistributions of source code must retain the above copyright
Packit Service 6754ca
// notice, this list of conditions and the following disclaimer.
Packit Service 6754ca
// *       Redistributions in binary form must reproduce the above
Packit Service 6754ca
// copyright notice, this list of conditions and the following disclaimer
Packit Service 6754ca
// in the documentation and/or other materials provided with the
Packit Service 6754ca
// distribution.
Packit Service 6754ca
// *       Neither the name of Industrial Light & Magic nor the names of
Packit Service 6754ca
// its contributors may be used to endorse or promote products derived
Packit Service 6754ca
// from this software without specific prior written permission. 
Packit Service 6754ca
// 
Packit Service 6754ca
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
Packit Service 6754ca
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
Packit Service 6754ca
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
Packit Service 6754ca
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
Packit Service 6754ca
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
Packit Service 6754ca
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
Packit Service 6754ca
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
Packit Service 6754ca
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
Packit Service 6754ca
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
Packit Service 6754ca
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
Packit Service 6754ca
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Packit Service 6754ca
//
Packit Service 6754ca
///////////////////////////////////////////////////////////////////////////
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
#ifndef INCLUDED_IMF_ATTRIBUTE_H
Packit Service 6754ca
#define INCLUDED_IMF_ATTRIBUTE_H
Packit Service 6754ca
Packit Service 6754ca
//-----------------------------------------------------------------------------
Packit Service 6754ca
//
Packit Service 6754ca
//	class Attribute
Packit Service 6754ca
//
Packit Service 6754ca
//-----------------------------------------------------------------------------
Packit Service 6754ca
Packit Service 6754ca
#include "IexBaseExc.h"
Packit Service 6754ca
#include "ImfIO.h"
Packit Service 6754ca
#include "ImfXdr.h"
Packit Service 6754ca
#include "ImfForward.h"
Packit Service 6754ca
#include "ImfExport.h"
Packit Service 6754ca
#include "ImfNamespace.h"
Packit Service 6754ca
Packit Service 6754ca
OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
class IMF_EXPORT Attribute
Packit Service 6754ca
{
Packit Service 6754ca
  public:
Packit Service 6754ca
Packit Service 6754ca
    //---------------------------
Packit Service 6754ca
    // Constructor and destructor
Packit Service 6754ca
    //---------------------------
Packit Service 6754ca
Packit Service 6754ca
    Attribute ();
Packit Service 6754ca
    virtual ~Attribute ();
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
    //-------------------------------
Packit Service 6754ca
    // Get this attribute's type name
Packit Service 6754ca
    //-------------------------------
Packit Service 6754ca
Packit Service 6754ca
    virtual const char *	typeName () const = 0;
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
    //------------------------------
Packit Service 6754ca
    // Make a copy of this attribute
Packit Service 6754ca
    //------------------------------
Packit Service 6754ca
Packit Service 6754ca
    virtual Attribute *		copy () const = 0;
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
    //----------------------------------------
Packit Service 6754ca
    // Type-specific attribute I/O and copying
Packit Service 6754ca
    //----------------------------------------
Packit Service 6754ca
Packit Service 6754ca
    virtual void		writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os,
Packit Service 6754ca
					      int version) const = 0;
Packit Service 6754ca
Packit Service 6754ca
    virtual void		readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is,
Packit Service 6754ca
					       int size,
Packit Service 6754ca
					       int version) = 0;
Packit Service 6754ca
Packit Service 6754ca
    virtual void		copyValueFrom (const Attribute &other) = 0;
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
    //------------------
Packit Service 6754ca
    // Attribute factory
Packit Service 6754ca
    //------------------
Packit Service 6754ca
Packit Service 6754ca
    static Attribute *		newAttribute (const char typeName[]);
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
    //-----------------------------------------------------------
Packit Service 6754ca
    // Test if a given attribute type has already been registered
Packit Service 6754ca
    //-----------------------------------------------------------
Packit Service 6754ca
Packit Service 6754ca
    static bool			knownType (const char typeName[]);
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
  protected:
Packit Service 6754ca
Packit Service 6754ca
    //--------------------------------------------------
Packit Service 6754ca
    // Register an attribute type so that newAttribute()
Packit Service 6754ca
    // knows how to make objects of this type.
Packit Service 6754ca
    //--------------------------------------------------
Packit Service 6754ca
Packit Service 6754ca
    static void		registerAttributeType (const char typeName[],
Packit Service 6754ca
					       Attribute *(*newAttribute)());
Packit Service 6754ca
Packit Service 6754ca
    //------------------------------------------------------
Packit Service 6754ca
    // Un-register an attribute type so that newAttribute()
Packit Service 6754ca
    // no longer knows how to make objects of this type (for
Packit Service 6754ca
    // debugging only).
Packit Service 6754ca
    //------------------------------------------------------
Packit Service 6754ca
Packit Service 6754ca
    static void		unRegisterAttributeType (const char typeName[]);
Packit Service 6754ca
};
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
//-------------------------------------------------
Packit Service 6754ca
// Class template for attributes of a specific type
Packit Service 6754ca
//-------------------------------------------------
Packit Service 6754ca
    
Packit Service 6754ca
template <class T>
Packit Service 6754ca
class TypedAttribute: public Attribute
Packit Service 6754ca
{
Packit Service 6754ca
  public:
Packit Service 6754ca
Packit Service 6754ca
    //----------------------------
Packit Service 6754ca
    // Constructors and destructor
Packit Service 6754ca
    //------------_---------------
Packit Service 6754ca
Packit Service 6754ca
    TypedAttribute ();
Packit Service 6754ca
    TypedAttribute (const T &value);
Packit Service 6754ca
    TypedAttribute (const TypedAttribute<T> &other);
Packit Service 6754ca
    virtual ~TypedAttribute ();
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
    //--------------------------------
Packit Service 6754ca
    // Access to the attribute's value
Packit Service 6754ca
    //--------------------------------
Packit Service 6754ca
Packit Service 6754ca
    T &					value ();
Packit Service 6754ca
    const T &				value () const;
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
    //--------------------------------
Packit Service 6754ca
    // Get this attribute's type name.
Packit Service 6754ca
    //--------------------------------
Packit Service 6754ca
Packit Service 6754ca
    virtual const char *		typeName () const;
Packit Service 6754ca
    
Packit Service 6754ca
Packit Service 6754ca
    //---------------------------------------------------------
Packit Service 6754ca
    // Static version of typeName()
Packit Service 6754ca
    // This function must be specialized for each value type T.
Packit Service 6754ca
    //---------------------------------------------------------
Packit Service 6754ca
Packit Service 6754ca
    static const char *			staticTypeName ();
Packit Service 6754ca
    
Packit Service 6754ca
Packit Service 6754ca
    //---------------------
Packit Service 6754ca
    // Make a new attribute
Packit Service 6754ca
    //---------------------
Packit Service 6754ca
Packit Service 6754ca
    static Attribute *			makeNewAttribute ();
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
    //------------------------------
Packit Service 6754ca
    // Make a copy of this attribute
Packit Service 6754ca
    //------------------------------
Packit Service 6754ca
Packit Service 6754ca
    virtual Attribute *			copy () const;
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
    //-----------------------------------------------------------------
Packit Service 6754ca
    // Type-specific attribute I/O and copying.
Packit Service 6754ca
    // Depending on type T, these functions may have to be specialized.
Packit Service 6754ca
    //-----------------------------------------------------------------
Packit Service 6754ca
Packit Service 6754ca
    virtual void		writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os,
Packit Service 6754ca
					      int version) const;
Packit Service 6754ca
Packit Service 6754ca
    virtual void		readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is,
Packit Service 6754ca
					       int size,
Packit Service 6754ca
					       int version);
Packit Service 6754ca
Packit Service 6754ca
    virtual void		copyValueFrom (const Attribute &other);
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
    //------------------------------------------------------------
Packit Service 6754ca
    // Dynamic casts that throw exceptions instead of returning 0.
Packit Service 6754ca
    //------------------------------------------------------------
Packit Service 6754ca
Packit Service 6754ca
    static TypedAttribute *		cast (Attribute *attribute);
Packit Service 6754ca
    static const TypedAttribute *	cast (const Attribute *attribute);
Packit Service 6754ca
    static TypedAttribute &		cast (Attribute &attribute);
Packit Service 6754ca
    static const TypedAttribute &	cast (const Attribute &attribute);
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
    //---------------------------------------------------------------
Packit Service 6754ca
    // Register this attribute type so that Attribute::newAttribute()
Packit Service 6754ca
    // knows how to make objects of this type.
Packit Service 6754ca
    //
Packit Service 6754ca
    // Note that this function is not thread-safe because it modifies
Packit Service 6754ca
    // a global variable in the IlmIlm library.  A thread in a multi-
Packit Service 6754ca
    // threaded program may call registerAttributeType() only when no
Packit Service 6754ca
    // other thread is accessing any functions or classes in the
Packit Service 6754ca
    // IlmImf library.
Packit Service 6754ca
    //
Packit Service 6754ca
    //---------------------------------------------------------------
Packit Service 6754ca
Packit Service 6754ca
    static void				registerAttributeType ();
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
    //-----------------------------------------------------
Packit Service 6754ca
    // Un-register this attribute type (for debugging only)
Packit Service 6754ca
    //-----------------------------------------------------
Packit Service 6754ca
Packit Service 6754ca
    static void				 unRegisterAttributeType ();
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
  private:
Packit Service 6754ca
Packit Service 6754ca
    T					_value;
Packit Service 6754ca
};
Packit Service 6754ca
Packit Service 6754ca
//------------------------------------
Packit Service 6754ca
// Implementation of TypedAttribute<T>
Packit Service 6754ca
//------------------------------------
Packit Service 6754ca
template <class T>
Packit Service 6754ca
TypedAttribute<T>::TypedAttribute ():
Packit Service 6754ca
    Attribute (),
Packit Service 6754ca
    _value (T())
Packit Service 6754ca
{
Packit Service 6754ca
    // empty
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
template <class T>
Packit Service 6754ca
TypedAttribute<T>::TypedAttribute (const T & value):
Packit Service 6754ca
    Attribute (),
Packit Service 6754ca
    _value (value)
Packit Service 6754ca
{
Packit Service 6754ca
    // empty
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
template <class T>
Packit Service 6754ca
TypedAttribute<T>::TypedAttribute (const TypedAttribute<T> &other):
Packit Service 6754ca
    Attribute (other),
Packit Service 6754ca
    _value ()
Packit Service 6754ca
{
Packit Service 6754ca
    copyValueFrom (other);
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
template <class T>
Packit Service 6754ca
TypedAttribute<T>::~TypedAttribute ()
Packit Service 6754ca
{
Packit Service 6754ca
    // empty
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
template <class T>
Packit Service 6754ca
inline T &
Packit Service 6754ca
TypedAttribute<T>::value ()
Packit Service 6754ca
{
Packit Service 6754ca
    return _value;
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
template <class T>
Packit Service 6754ca
inline const T &
Packit Service 6754ca
TypedAttribute<T>::value () const
Packit Service 6754ca
{
Packit Service 6754ca
    return _value;
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
template <class T>
Packit Service 6754ca
const char *	
Packit Service 6754ca
TypedAttribute<T>::typeName () const
Packit Service 6754ca
{
Packit Service 6754ca
    return staticTypeName();
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
template <class T>
Packit Service 6754ca
Attribute *
Packit Service 6754ca
TypedAttribute<T>::makeNewAttribute ()
Packit Service 6754ca
{
Packit Service 6754ca
    return new TypedAttribute<T>();
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
template <class T>
Packit Service 6754ca
Attribute *
Packit Service 6754ca
TypedAttribute<T>::copy () const
Packit Service 6754ca
{
Packit Service 6754ca
    Attribute * attribute = new TypedAttribute<T>();
Packit Service 6754ca
    attribute->copyValueFrom (*this);
Packit Service 6754ca
    return attribute;
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
template <class T>
Packit Service 6754ca
void		
Packit Service 6754ca
TypedAttribute<T>::writeValueTo (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os,
Packit Service 6754ca
                                    int version) const
Packit Service 6754ca
{
Packit Service 6754ca
    OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::write <OPENEXR_IMF_INTERNAL_NAMESPACE::StreamIO> (os, _value);
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
template <class T>
Packit Service 6754ca
void		
Packit Service 6754ca
TypedAttribute<T>::readValueFrom (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is,
Packit Service 6754ca
                                     int size,
Packit Service 6754ca
                                     int version)
Packit Service 6754ca
{
Packit Service 6754ca
    OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read <OPENEXR_IMF_INTERNAL_NAMESPACE::StreamIO> (is, _value);
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
template <class T>
Packit Service 6754ca
void		
Packit Service 6754ca
TypedAttribute<T>::copyValueFrom (const Attribute &other)
Packit Service 6754ca
{
Packit Service 6754ca
    _value = cast(other)._value;
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
template <class T>
Packit Service 6754ca
TypedAttribute<T> *
Packit Service 6754ca
TypedAttribute<T>::cast (Attribute *attribute)
Packit Service 6754ca
{
Packit Service 6754ca
    TypedAttribute<T> *t =
Packit Service 6754ca
	dynamic_cast <TypedAttribute<T> *> (attribute);
Packit Service 6754ca
Packit Service 6754ca
    if (t == 0)
Packit Service 6754ca
	throw IEX_NAMESPACE::TypeExc ("Unexpected attribute type.");
Packit Service 6754ca
Packit Service 6754ca
    return t;
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
template <class T>
Packit Service 6754ca
const TypedAttribute<T> *
Packit Service 6754ca
TypedAttribute<T>::cast (const Attribute *attribute)
Packit Service 6754ca
{
Packit Service 6754ca
    const TypedAttribute<T> *t =
Packit Service 6754ca
	dynamic_cast <const TypedAttribute<T> *> (attribute);
Packit Service 6754ca
Packit Service 6754ca
    if (t == 0)
Packit Service 6754ca
	throw IEX_NAMESPACE::TypeExc ("Unexpected attribute type.");
Packit Service 6754ca
Packit Service 6754ca
    return t;
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
template <class T>
Packit Service 6754ca
inline TypedAttribute<T> &
Packit Service 6754ca
TypedAttribute<T>::cast (Attribute &attribute)
Packit Service 6754ca
{
Packit Service 6754ca
    return *cast (&attribute);
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
template <class T>
Packit Service 6754ca
inline const TypedAttribute<T> &
Packit Service 6754ca
TypedAttribute<T>::cast (const Attribute &attribute)
Packit Service 6754ca
{
Packit Service 6754ca
    return *cast (&attribute);
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
template <class T>
Packit Service 6754ca
inline void
Packit Service 6754ca
TypedAttribute<T>::registerAttributeType ()
Packit Service 6754ca
{
Packit Service 6754ca
    Attribute::registerAttributeType (staticTypeName(), makeNewAttribute);
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
template <class T>
Packit Service 6754ca
inline void
Packit Service 6754ca
TypedAttribute<T>::unRegisterAttributeType ()
Packit Service 6754ca
{
Packit Service 6754ca
    Attribute::unRegisterAttributeType (staticTypeName());
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
#endif