secureswitools/swisistools/source/sisxlibrary/container.h
changeset 0 ba25891c3a9e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/secureswitools/swisistools/source/sisxlibrary/container.h	Thu Dec 17 08:51:10 2009 +0200
@@ -0,0 +1,364 @@
+/*
+* Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "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: 
+* Note: This file may contain code to generate corrupt files for test purposes.
+* Such code is excluded from production builds by use of compiler defines;
+* it is recommended that such code should be removed if this code is ever published publicly.
+* common functionality for containers in SIS files
+*
+*/
+
+
+/**
+ @file 
+ @internalComponent
+ @released
+*/
+
+#ifndef __CONTAINER_H__
+#define __CONTAINER_H__
+
+#include "field.h"
+#include <vector>
+
+template<class T, CSISFieldRoot::TFieldType FieldType> class CContainer : public CSISField <FieldType>
+	{
+public:
+	typedef std::vector <T*>		TMem;
+	typedef  typename TMem::iterator		TMemIter;
+	typedef  typename TMem::const_iterator	TMemConIter;
+	typedef  typename TMem::size_type		TMemSize;
+
+public:
+	/**
+	 * Default constructor
+	 */
+	CContainer ();
+	/**
+	 * Explicit parameterized constructor
+	 */
+	explicit CContainer (const bool aRequired);
+	/**
+	 * Copy Constructor
+	 */
+	CContainer (const CContainer <T, FieldType>& c);
+	/**
+	 * Constructor. It also reserves space.
+	 */
+	CContainer (const CContainer <T, FieldType>& c, const TMemSize aReserve);
+
+	/**
+	 * Retrieves the size of the structure.
+	 * @param aInsideArray - whether the structure is part of an array or not. 
+	 * @return byte count.
+	 */
+	virtual CSISFieldRoot::TFieldSize ByteCount (const bool aIsArray) const;
+	/**
+	 * Sets the size of the structure.
+	 * @param size - size of the structure. 
+	 */
+	virtual void SetByteCount (const CSISFieldRoot::TFieldSize size);
+	/**
+	 * This function verifies the structure
+	 * @param aLanguage - language
+	 */ 
+	virtual void Verify (const TUint32 aLanguages) const;
+	/**
+	 * If object not acceptable, modify it. Assumes, once modified, will not need modifying again
+	 */
+	virtual void MakeNeat ();
+	/**
+	 * Dump the entire content in hex format into the stream
+	 */
+	virtual void Dump (std::ostream& aStream, const int aLevel) const;
+	/**
+	 * Calculates CRC of the content
+	 * @param aCRC CRC value of the content
+	 * @param aIsArrayElement whether the structure is part of an array or not. 
+	 */ 
+	virtual void CalculateCrc (TCRC& aCRC, const bool aIsArrayElement) const;
+#ifdef GENERATE_ERRORS
+	virtual void CreateDefects ();
+#endif // GENERATE_ERRORS
+
+	/**
+	 * @return Item count
+	 */
+	TMemSize size () const
+		{
+		return iMem.size ();
+		}
+	/**
+	 * Assign new items to the container.
+	 * @param aBegin iterator start
+	 * @param aEnd iterator end
+	 */
+	void assign (TMemConIter aBegin, TMemConIter aEnd);
+	/**
+	 * Clear the items
+	 */
+	void clear ();
+
+	/**
+	 * Iterator functionality
+	 * @return iterator pointing to the begining of the item list
+	 */
+	TMemConIter begin () const
+		{
+		return iMem.begin ();
+		}
+	/**
+	 * Iterator functionality
+	 * @return iterator pointing to the end of the item list
+	 */
+	TMemConIter end () const
+		{
+		return iMem.end ();
+		}
+	/**
+	 * Iterator functionality
+	 * @return iterator pointing to the begining of the item list
+	 */
+	TMemIter begin ()
+		{
+		return iMem.begin ();
+		}
+	/**
+	 * Iterator functionality
+	 * @return iterator pointing to the end of the item list
+	 */
+	TMemIter end ()
+		{
+		return iMem.end ();
+		}
+
+	/**
+	 * Retrieve the most recent item from the container and delete it from 
+	 * the container list.
+	 */
+	void Pop ();
+
+protected:
+	const T& operator [] (const TMemSize& aIndex) const;
+	T& operator [] (const TMemSize& aIndex);
+	void Push (T* aData);
+	const T& Last () const;
+	T& Last ();
+
+protected:
+	TMem						iMem;
+	CSISFieldRoot::TFieldSize	iSize;
+	};
+
+// macros for accessing template member variable and type 
+#define ContainerMemSize(aType, aFieldType)  typename CContainer<aType, aFieldType>::TMemSize
+#define ContainerMem(aType,aFieldType) CContainer<aType, aFieldType>::iMem
+#define ContainerIter(aType) typename CContainer<aType, FieldType>::TMemConIter
+
+
+template <class T, CSISFieldRoot::TFieldType FieldType> inline
+	CContainer <T, FieldType>::CContainer () :
+		iSize (0)
+	{
+	}
+
+template <class T, CSISFieldRoot::TFieldType FieldType> inline
+	CContainer <T, FieldType>::CContainer (const bool aRequired) :
+		iSize (0), 
+		CSISField <FieldType> (aRequired)
+	{
+	}
+
+template <class T, CSISFieldRoot::TFieldType FieldType> inline
+	CContainer <T, FieldType>::CContainer (const CContainer <T, FieldType>& c) :
+		CSISField <FieldType> (c),
+		iMem (c.iMem),
+		iSize (c.iSize)
+	{
+	}
+
+template <class T, CSISFieldRoot::TFieldType FieldType> inline
+	CContainer <T, FieldType>::CContainer (const CContainer <T, FieldType>& c, const TMemSize aReserve) :
+		CSISField <FieldType> (c),
+		iMem (aReserve),
+		iSize (0)
+	{
+	}
+
+
+template <class T, CSISFieldRoot::TFieldType FieldType> 
+		void CContainer <T, FieldType>::clear ()
+	{
+	iMem.clear ();
+	}
+
+template <class T, CSISFieldRoot::TFieldType FieldType> inline
+		void CContainer <T, FieldType>::assign (TMemConIter aBegin, TMemConIter aEnd)
+	{
+	iMem.assign (aBegin, aEnd);
+	}
+
+
+template <class T, CSISFieldRoot::TFieldType FieldType> 
+		void CContainer <T, FieldType>::Verify (const TUint32 aLanguages) const
+	{
+	for (TMemConIter iterMemb = iMem.begin (); iterMemb != iMem.end (); iterMemb++)
+		{
+		assert (*iterMemb != NULL);
+		(*iterMemb) -> Verify (aLanguages);
+		}
+	}
+
+template <class T, CSISFieldRoot::TFieldType FieldType>
+		void CContainer <T, FieldType>::MakeNeat ()
+	{
+	for (TMemIter iterMemb = iMem.begin (); iterMemb != iMem.end (); iterMemb++)
+		{
+		assert (*iterMemb != NULL);
+		(*iterMemb) -> MakeNeat ();
+		}
+	}
+
+template <class T, CSISFieldRoot::TFieldType FieldType>
+		void CContainer <T, FieldType>::Dump (std::ostream& aStream, const int aLevel) const
+	{
+	for (TMemSize index = 0; index < size (); index++)
+		{
+		if (index > 0) 
+			{
+			aStream << std::string (aLevel, ' ');
+			}
+		if (iMem [index] -> Name ().empty ()) 
+			{
+			aStream << "  ";
+			}
+		else
+			{
+			aStream << iMem [index] -> Name ();
+			if (FieldType == CSISFieldRoot::ESISArray) 
+				{
+				aStream << " [" << index << "]";
+				}
+			aStream << iMem [index] -> NoteIfOptional ();
+			aStream << std::endl << std::string (aLevel + 2, ' ');
+			}
+		iMem [index] -> Dump (aStream, aLevel + 2);
+		if (index + 1 < size ()) 
+			{
+			aStream << std::endl;
+			}
+		}
+	}
+
+
+template <class T, CSISFieldRoot::TFieldType FieldType>
+		CSISFieldRoot::TFieldSize CContainer <T, FieldType>::ByteCount (const bool aIsArray) const
+	{
+	if (WasteOfSpace ()) 
+		{
+		return 0;
+		}
+	CSISFieldRoot::TFieldSize size = 0;
+	for (TMemConIter iterMemb = iMem.begin (); iterMemb != iMem.end (); iterMemb++)
+		{
+		assert (*iterMemb != NULL);
+		size += (*iterMemb) -> ByteCountWithHeader (aIsArray);
+		}
+	return size; 
+	}
+
+template <class T, CSISFieldRoot::TFieldType FieldType> inline
+		void CContainer <T, FieldType>::SetByteCount (const CSISFieldRoot::TFieldSize aSize)
+	{
+	iSize = aSize;
+	}
+
+
+template <class T, CSISFieldRoot::TFieldType FieldType>
+		void CContainer <T, FieldType>::CalculateCrc (TCRC& aCRC, const bool aIsArrayElement) const
+	{ 
+	if(!WasteOfSpace())
+		{
+		for (TMemConIter iterMemb = iMem.begin (); iterMemb != iMem.end (); iterMemb++)
+			{
+			assert (*iterMemb != NULL);
+			(*iterMemb) -> CalculateCrc (aCRC, aIsArrayElement);
+			}
+		CSISFieldRoot::PaddingCrc(aCRC, ByteCount(false));
+		}
+	}
+
+#ifdef GENERATE_ERRORS
+template <class T, CSISFieldRoot::TFieldType FieldType>
+		void CContainer <T, FieldType>::CreateDefects ()
+	{ 
+	for (TMemConIter iterMemb = iMem.begin (); iterMemb != iMem.end (); iterMemb++)
+		{
+		assert (*iterMemb != NULL);
+		(*iterMemb) -> CreateDefects ();
+		}
+	}
+#endif // GENERATE_ERRORS
+
+
+template <class T, CSISFieldRoot::TFieldType FieldType> 
+		const T& CContainer <T, FieldType>::operator [] (const TMemSize& aIndex) const
+	{
+	assert (aIndex < size ());
+	assert (iMem [aIndex] != NULL);
+	return (*iMem [aIndex]);
+	}
+
+template <class T, CSISFieldRoot::TFieldType FieldType> 
+		T& CContainer <T, FieldType>::operator [] (const TMemSize& aIndex)
+	{
+	assert (aIndex < size ());
+	assert (iMem [aIndex] != NULL);
+	return (*iMem [aIndex]);
+	}
+
+template <class T, CSISFieldRoot::TFieldType FieldType> inline
+		void CContainer <T, FieldType>::Push (T* aData)
+	{
+	iMem.push_back (aData);
+	}
+
+template <class T, CSISFieldRoot::TFieldType FieldType> inline
+		const T& CContainer <T, FieldType>::Last () const
+	{
+	assert (size () > 0);
+	assert (iMem [iMem.size () - 1] != NULL);
+	return * (iMem [iMem.size () - 1]);
+	}
+
+template <class T, CSISFieldRoot::TFieldType FieldType> inline
+		T& CContainer <T, FieldType>::Last ()
+	{
+	assert (size () > 0);
+	assert (iMem [iMem.size () - 1] != NULL);
+	return * (iMem [iMem.size () - 1]);
+	}
+
+template <class T, CSISFieldRoot::TFieldType FieldType> inline
+		void CContainer <T, FieldType>::Pop ()
+	{
+	assert (size () > 0);
+	assert (iMem [iMem.size () - 1] != NULL);
+	T* ptr = iMem [iMem.size () - 1];
+	iMem.pop_back ();
+	delete ptr;
+	}
+
+#endif // __SISXTYPE_H__
+