webservices/wsutils/inc/senpointermap.h
changeset 0 62f9d29f7211
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/webservices/wsutils/inc/senpointermap.h	Thu Jan 07 16:19:19 2010 +0200
@@ -0,0 +1,279 @@
+/*
+* Copyright (c) 2002-2005 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:    Header declaration
+*
+*/
+
+
+
+
+
+
+
+
+
+
+
+#ifndef POINTERMAP_H
+#define POINTERMAP_H
+
+// INCLUDES
+#include <e32std.h>
+
+// CLASS DECLARATION
+template <typename K, typename V>
+class RSenPointerMap
+    {
+    public: // Constructors and destructor
+        
+    RSenPointerMap(TBool aTakeOwnershipKey, TBool aTakeOwnershipValue)
+        :
+        iTakeOwnershipKey(aTakeOwnershipKey),
+        iTakeOwnershipValue(aTakeOwnershipValue)
+        {}
+
+    ~RSenPointerMap()
+        {
+        Reset();
+        }
+
+        // New functions
+        
+    TInt Append(const K* aKey, const V* aValue)
+        {
+        TInt err = iKeys.Append(aKey);
+        if (err == KErrNone)
+            {
+            err = iValues.Append(aValue);
+            if (err != KErrNone)
+                {
+                // last element of iKeys should be removed
+                TInt lastElementIndex = iKeys.Count() - 1;
+                iKeys.Remove(lastElementIndex);
+                }
+            }
+        return err;
+        }
+
+    TInt Find(const K& aKey) const
+        {
+        TInt index( KErrNotFound );
+        for (TInt i = 0; i < iKeys.Count(); i++)
+            {
+            if (*iKeys[i] == aKey)
+                {
+                index = i;
+                break;
+                }
+            }
+        return index;
+        }
+
+    TInt FindReverse(const K& aKey) const
+        {
+        TInt index( KErrNotFound );
+        TInt count( iKeys.Count() );
+        for (TInt i = count-1; i >=0 ; i--)
+            {
+            if (*iKeys[i] == aKey)
+                {
+                index = i;
+                break;
+                }
+            }
+        return index;
+        }
+        
+        
+    TInt RemoveAt( TInt aIndex ) 
+        {
+        K* key = KeyAt( aIndex );
+    	return RemoveByKey( *key );
+    	}
+
+    // @return the index of removed key-value pair, or
+    // KErrNotFound, if such key was not found
+    TInt RemoveByKey(const K& aKey)
+        {
+        TInt index = Find(aKey);
+        if (index != KErrNotFound)
+            {
+            if(iTakeOwnershipKey)
+                {
+                K* key = KeyAt(index);
+                delete key;
+                }
+            if(iTakeOwnershipValue)
+                {
+                V* value = iValues[index];
+                delete value;
+                }
+            iKeys.Remove(index);
+            iValues.Remove(index);
+            }
+        return index;
+        }
+
+    // @return the index of removed key-value pair, or
+    // KErrNotFound, if such key was not found
+    TInt Remove(const V& aValue)
+        {
+        TInt index = FindValue(aValue);
+        if (index != KErrNotFound)
+            {
+            if (iTakeOwnershipValue)
+                {
+                V* value = iValues[index];
+                delete value;
+                }
+            if (iTakeOwnershipKey)
+                {
+                K* key = iKeys[index];
+                delete key;
+                }
+            iValues.Remove(index);
+            iKeys.Remove(index);
+            }
+        return index; 
+        }
+
+    TInt FindValue(const V& aValue) const
+        {
+        TInt index = KErrNotFound;
+        for (TInt i = 0; i < iValues.Count(); i++)
+            {
+            if ((iValues[i]) && (*iValues[i] == aValue))
+                {
+                index = i;
+                break;
+                }
+            }
+        return index;
+        }
+
+
+    // Note: deletes the current value of this key
+    TInt UpdateValue(const K* aKey, const V* aValue)
+        {
+        TInt index=Find(*aKey);
+        if (index==KErrNotFound)
+            {
+            return Append(aKey, aValue);
+            }
+
+        V* bValue=iValues[index];
+        if (iTakeOwnershipValue)
+            {
+            // Since OWNED value is going to be replaced with aValue,
+            // destroy old value instance first:
+            delete bValue;  
+            }
+
+        iValues[index]=(V*)aValue;
+        return KErrNone;
+        }
+
+
+    K* KeyAt(TInt aIndex)
+        {
+        return iKeys[aIndex];
+        }
+
+    const V* ValueAt(TInt aIndex) const
+        {
+        return iValues[aIndex];
+        }
+
+    TInt Count() const
+        {
+        return iKeys.Count();
+        }
+
+    void Reset()
+        {
+        if ( iTakeOwnershipKey )
+            {
+            iKeys.ResetAndDestroy();
+            }
+        else
+            {
+            iKeys.Reset();
+            }
+
+        if ( iTakeOwnershipValue )
+            {
+            iValues.ResetAndDestroy();
+            }
+        else
+            {
+            iValues.Reset();
+            }
+        }
+        
+    TInt Insert(const K* aKey, const V* aValue)
+        {
+        TInt count=iKeys.Count();
+        TInt err=KErrNone;
+		TBool inserted=EFalse;
+
+        for(TInt i=0; i<count; i++)
+        	{
+        	 if(*iKeys[i] >= *aKey)
+        	 {
+	        err = iKeys.Insert(aKey, i);
+	        if (err == KErrNone)
+	            {
+	            err = iValues.Insert(aValue, i);
+	            if (err != KErrNone)
+	                {
+	                // inserted element of iKeys should be removed
+	                iKeys.Remove(i);
+	                }
+				    else
+					{
+					inserted=ETrue;
+					}
+            	}
+			break;  	 	
+        	 }
+			}
+
+        if(!inserted)
+        	{
+	        err = iKeys.Append(aKey);
+	        if (err == KErrNone)
+	            {
+	            err = iValues.Append(aValue);
+	            if (err != KErrNone)
+	                {
+	                // last element of iKeys should be removed
+	                TInt lastElementIndex = iKeys.Count() - 1;
+	                iKeys.Remove(lastElementIndex);
+	                }
+            	}
+        	}
+	return err;
+        }
+        
+    private: // Data
+    TBool iTakeOwnershipKey;
+    TBool iTakeOwnershipValue;
+    RPointerArray<K> iKeys;
+    RPointerArray<V> iValues;
+    };
+
+#endif // POINTERMAP_H
+
+// End of File
+