summaryrefslogtreecommitdiff
path: root/public/include/XMPCommon/Interfaces/BaseInterfaces/IVersionable.h
diff options
context:
space:
mode:
Diffstat (limited to 'public/include/XMPCommon/Interfaces/BaseInterfaces/IVersionable.h')
-rw-r--r--public/include/XMPCommon/Interfaces/BaseInterfaces/IVersionable.h71
1 files changed, 71 insertions, 0 deletions
diff --git a/public/include/XMPCommon/Interfaces/BaseInterfaces/IVersionable.h b/public/include/XMPCommon/Interfaces/BaseInterfaces/IVersionable.h
new file mode 100644
index 0000000..ec60747
--- /dev/null
+++ b/public/include/XMPCommon/Interfaces/BaseInterfaces/IVersionable.h
@@ -0,0 +1,71 @@
+#ifndef IVersionable_h__
+#define IVersionable_h__ 1
+
+// =================================================================================================
+// ADOBE SYSTEMS INCORPORATED
+// Copyright 2015 Adobe Systems Incorporated
+// All Rights Reserved
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+// =================================================================================================
+
+#include "XMPCommon/XMPCommonFwdDeclarations.h"
+
+namespace AdobeXMPCommon {
+
+ //!
+ //! \brief Interface that serves as the base interface for all the externally exposed interfaces
+ //! which needs to provide evolving versions of the interface.
+ //! @details Provide pointer to interface requested by client.
+ //! Requirements on the class type
+ //! -# Need to implement a function GetInterfaceID() returning a unique id for the
+ //! interface. Only required to be implemented in first version of the interface.
+ //! -# Need to implement a function GetVersionNumber() returning the version of the
+ //! interface. Required to implemented by each version of the interface.
+ //!
+
+ class XMP_PUBLIC IVersionable {
+ public:
+
+ //!
+ //! @brief Get the raw pointer to an interface object implementing the requested version.
+ //! \return a raw pointer to an interface object implementing the requested version.
+ //! \attention In case a particular version number is not supported than an error is
+ //! thrown.
+ //!
+ template< typename requestedInterface >
+ XMP_PRIVATE requestedInterface * GetInterfacePointer() {
+ pvoid ptr = GetInterfacePointer( requestedInterface::GetInterfaceID(),
+ requestedInterface::GetInterfaceVersion() );
+ return static_cast< requestedInterface * >( ptr );
+ }
+
+ //!
+ //! @brief Get the raw pointer to a const interface object implementing the requested version.
+ //! \return a raw pointer to a const interface object implementing the requested version.
+ //! \attention In case a particular version number is not supported than an error is
+ //! thrown.
+ //!
+ template< typename requestedInterface >
+ XMP_PRIVATE const requestedInterface * GetInterfacePointer() const {
+ return const_cast< IVersionable * >( this )->GetInterfacePointer< requestedInterface >();
+ }
+
+ protected:
+ virtual ~IVersionable() {}
+ //! \cond XMP_INTERNAL_DOCUMENTATION
+ virtual pvoid APICALL GetInterfacePointer( uint64 interfaceID, uint32 interfaceVersion ) = 0;
+ // all safe functions
+ virtual pvoid APICALL getInterfacePointer( uint64 interfaceID, uint32 interfaceVersion, pcIError_base & error ) __NOTHROW__ = 0;
+ //! \endcond
+
+ #ifdef FRIEND_CLASS_DECLARATION
+ FRIEND_CLASS_DECLARATION();
+ #endif
+ REQ_FRIEND_CLASS_DECLARATION();
+ };
+
+}
+
+#endif // IVersionable_h__