usbdrv/peripheral/public/usbcque.h
author hgs
Wed, 03 Nov 2010 10:49:35 +0800
changeset 63 705964cc7132
parent 59 bbdce6bffaad
permissions -rw-r--r--
201043_01

/*
* Copyright (c) 2010 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:
* e32\include\drivers\usbcque.h
* Simple singly linked list + its iterator for the USB Device driver.
*
*/
/**
 @file usbcque.h
 @internalTechnology
*/

#ifndef __USBCQUE_H__
#define __USBCQUE_H__

#include <kernel/kernel.h>


//
// --- Class definitions ---
//

class TSglQueLink
	{
private:
	void Enque(TSglQueLink* aLink);
public:
	TSglQueLink* iNext;
	friend class TSglQueBase;
	};


class TSglQueBase
	{
protected:
	TSglQueBase(TInt aOffset);
	void DoAddLast(TAny* aPtr);
	void DoRemove(TAny* aPtr);
protected:
	TSglQueLink* iHead;
	TSglQueLink* iLast;
	TInt iOffset;
	TInt iElements;
private:
	friend class TSglQueIterBase;
	};


template<class T>
class TSglQue : public TSglQueBase
	{
public:
	inline TSglQue(TInt aOffset);
	inline void AddLast(T& aRef);
	inline void Remove(T& aRef);
	inline TInt Elements() const;
	};


class TSglQueIterBase
	{
public:
	void SetToFirst();
protected:
	TSglQueIterBase(TSglQueBase& aQue);
	TAny* DoPostInc();
	TAny* DoCurrent();
protected:
	TInt iOffset;
	TSglQueLink*& iHead;
	TSglQueLink* iNext;
	};


template<class T>
class TSglQueIter : public TSglQueIterBase
	{
public:
	inline TSglQueIter(TSglQueBase& aQue);
	inline operator T*();
	inline T* operator++(TInt);
	};

//
// --- Inline implementations ---
//

// Class TSglQue
template<class T>
inline TSglQue<T>::TSglQue(TInt aOffset)
	: TSglQueBase(aOffset)
	{}


template<class T>
inline void TSglQue<T>::AddLast(T& aRef)
	{
	DoAddLast(&aRef);
	}


template<class T>
inline void TSglQue<T>::Remove(T& aRef)
	{
	DoRemove(&aRef);
	}


template<class T>
inline TInt TSglQue<T>::Elements() const
	{
	return iElements;
	}


// Class TSglQueIter
template<class T>
inline TSglQueIter<T>::TSglQueIter(TSglQueBase& aQue)
	: TSglQueIterBase(aQue)
	{}


template<class T>
inline TSglQueIter<T>::operator T*()
	{
	return ((T*)DoCurrent());
	}

template<class T>
inline T* TSglQueIter<T>::operator++(TInt)
	{
	return ((T*)DoPostInc());
	}


#endif	// __USBCQUE_H__