hostsupport/hostegl/src/EGLUtils.cpp
branchbug235_bringup_0
changeset 53 c2ef9095503a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hostsupport/hostegl/src/EGLUtils.cpp	Wed Oct 06 17:59:01 2010 +0100
@@ -0,0 +1,158 @@
+/* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and /or associated documentation files
+ * (the "Materials "), to deal in the Materials without restriction,
+ * including without limitation the rights to use, copy, modify, merge,
+ * publish, distribute, sublicense, and/or sell copies of the Materials,
+ * and to permit persons to whom the Materials are furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Materials.
+ *
+ * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE MATERIALS OR
+ * THE USE OR OTHER DEALINGS IN THE MATERIALS.
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:
+ *
+ */
+
+#include "EGLUtils.h"
+#include "EGLSurface.h"
+#include "EGLContext.h"
+#include "EGLImage.h"
+#include "EGLThread.h"
+#include "EGLProcess.h"
+#include "EGLConfig.h"
+#include "EGLDisplay.h"
+
+template<class T>
+void AddObject( std::vector<T*>& vector, T*& object )
+    {
+    if( !object ) return;
+    try
+        {
+        vector.push_back(object);
+        }
+    catch( std::bad_alloc )
+        {
+        delete object;
+        object = NULL;
+        }
+    }
+
+template<class T>
+T* FindObjectByPointer( const std::vector<T*>& vector, void* item, int* index )
+    {
+    T* ret = NULL;
+    for( typename std::vector<T*>::size_type i = 0; i < vector.size(); i++ )
+        {
+        if( vector[i] == item )
+            {
+            ret = vector[i];
+            if( index ) *index = i;
+            break;
+            }
+        }
+    return ret;
+    }
+
+template<class T>
+T* FindObjectById( const std::vector<T*>& vector, EGLint id, int* index )
+    {
+    T* ret = NULL;
+    for( typename std::vector<T*>::size_type i = 0; i < vector.size(); i++ )
+        {
+        if( vector[i]->Id() == id )
+            {
+            ret = vector[i];
+            if( index ) *index = i;
+            break;
+            }
+        }
+    return ret;
+    }
+
+template<class T>
+void DeleteObjectByPointer( std::vector<T*>& vector, void* item )
+    {
+    int index;
+    T* object = FindObjectByPointer<T>( vector, item, &index );
+    if( object )
+        {
+        delete object;
+        vector.erase( vector.begin() + index );
+        }
+    }
+
+template<class T>
+void DeleteObjectById( std::vector<T*>& vector, EGLint id )
+    {
+    int index;
+    T* object = FindObjectById<T>(vector, id, &index );
+    if( object && object->Id() == id )
+        {
+        delete object;
+        vector.erase( vector.begin() + index );
+        }
+    }
+
+template<class T>
+void DestroyPointerVector( std::vector<T*>& vector )
+    {
+    for(typename std::vector<T*>::iterator iter = vector.begin(); iter != vector.end(); iter++)
+        {
+        delete (*iter);
+        }
+    vector.clear();
+    }
+
+// CEGLSurface
+template void AddObject( std::vector<class CEGLSurface*>& vector, class CEGLSurface*& object );
+template class CEGLSurface* FindObjectByPointer( const std::vector<class CEGLSurface*>& vector, void* item, int* index );
+template void DeleteObjectByPointer( std::vector<class CEGLSurface*>& vector, void* item );
+template void DestroyPointerVector( std::vector<class CEGLSurface*>& vector );
+
+// CEGLContext
+template void AddObject( std::vector<class CEGLContext*>& vector, class CEGLContext*& object );
+template void DeleteObjectByPointer( std::vector<class CEGLContext*>& vector, void* item );
+template void DestroyPointerVector( std::vector<class CEGLContext*>& vector );
+
+// CEGLImage
+template void AddObject( std::vector<class CEGLImage*>& vector, class CEGLImage*& object );
+template void DeleteObjectByPointer( std::vector<class CEGLImage*>& vector, void* item );
+template void DestroyPointerVector( std::vector<class CEGLImage*>& vector );
+
+// CEGLThread
+template void AddObject( std::vector<class CEGLThread*>& vector, class CEGLThread*& object );
+template void DeleteObjectById( std::vector<class CEGLThread*>& vector, EGLint id );
+template void DestroyPointerVector( std::vector<class CEGLThread*>& vector );
+template class CEGLThread* FindObjectById( const std::vector<class CEGLThread*>& vector, EGLint id, int* index );
+
+// CEGLProcess
+template void AddObject( std::vector<class CEGLProcess*>& vector, class CEGLProcess*& object );
+template void DestroyPointerVector( std::vector<class CEGLProcess*>& vector );
+template void DeleteObjectById( std::vector<class CEGLProcess*>& vector, EGLint id );
+
+// CEGLDisplay
+template void AddObject( std::vector<class CEGLDisplay*>& vector, class CEGLDisplay*& object );
+template class CEGLDisplay* FindObjectByPointer( const std::vector<class CEGLDisplay*>& vector, void* item, int* index );
+template void DeleteObjectByPointer( std::vector<class CEGLDisplay*>& vector, void* item );
+template void DestroyPointerVector( std::vector<class CEGLDisplay*>& vector );
+
+// CEGLConfig
+template void AddObject( std::vector<class CEGLConfig*>& vector, class CEGLConfig*& object );
+template class CEGLConfig* FindObjectByPointer( const std::vector<class CEGLConfig*>& vector, void* item, int* index );
+template class CEGLConfig* FindObjectById( const std::vector<class CEGLConfig*>& vector, EGLint id, int* index );
+template void DestroyPointerVector( std::vector<class CEGLConfig*>& vector );