
///////////////////////////////////////////////////////////////////////////////
//
// File   : AVP_Inventory_Item_QuantityData.h
// Author : Andy Tate
// Date   : 13-Nov-2007
//
// Copyright (C) 2007 Rebellion, All Rights Reserved.
//
///////////////////////////////////////////////////////////////////////////////

#ifdef ASURA_USE_PRAGMA_ONCE
	#pragma once
#endif   // ifdef ASURA_USE_PRAGMA_ONCE

#ifndef __AVP_INVENTORY_ITEM_QUANTITYDATA_H__
#define __AVP_INVENTORY_ITEM_QUANTITYDATA_H__

////////////////////////////////////////////////////////////////////////////////
// Include files...
////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////
// Forward class declarations...
////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////
// Class declaration...
////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////
// Class        : AVP_Inventory_Item_QuantityData
// Author       : Andy Tate
// Date         : 13-Nov-2007
//
// Description  : Class to handle the quantity of the particular inventory item.
////////////////////////////////////////////////////////////////////////////////

class AVP_Inventory_Item_QuantityData
{
public:
	// Public functions...
	AVP_Inventory_Item_QuantityData(const u_int uInitial, const u_int uMax)	: m_uCurrentQuantity(uInitial), m_uMaxQuantity(uMax)	{}
//	~AVP_Inventory_Item_QuantityData();

	// Quantity manipulation functions...
	u_int	DecreaseQuantity(const u_int uQuantity);
	u_int	IncreaseQuantity(const u_int uQuantity);

	// Accessor functions...
	void	InitialiseQuantity(const u_int uInitial, const u_int uMax)	{ m_uCurrentQuantity = uInitial; m_uMaxQuantity = uMax; }

	void	SetCurrentQuantity(const u_int uQuantity)	{ m_uCurrentQuantity = uQuantity; }
	u_int	GetCurrentQuantity(void) const				{ return(m_uCurrentQuantity); }

	void	SetMaxQuantity(const u_int uQuantity)	{ m_uMaxQuantity = uQuantity; }
	u_int	GetMaxQuantity(void) const				{ return(m_uMaxQuantity); }

	bool	IsEmpty(void) const	{ return(m_uCurrentQuantity == 0); }
	bool	IsFull(void) const	{ return(m_uCurrentQuantity == m_uMaxQuantity); }


protected:
	// Protected variables...
	u_int	m_uCurrentQuantity;		// The number of items of this type we have.
	u_int	m_uMaxQuantity;			// The maximum number of items of this type we can have.

	// Protected functions...


private:
	// Private variables...

	// Private functions...
	AVP_Inventory_Item_QuantityData(void);
	AVP_Inventory_Item_QuantityData(const AVP_Inventory_Item_QuantityData& xOther);

	AVP_Inventory_Item_QuantityData&	operator=(const AVP_Inventory_Item_QuantityData& xOther);

};   // End of class 'AVP_Inventory_Item_QuantityData'.



////////////////////////////////////////////////////////////////////////////////
// Inlined functions...
////////////////////////////////////////////////////////////////////////////////

inline u_int AVP_Inventory_Item_QuantityData::DecreaseQuantity(const u_int uQuantity)
{
	const u_int	uQuantityRemaining	= m_uCurrentQuantity;

	u_int		uActualQuantity;

	// Are we able to remove all of them?
	if(uQuantityRemaining < uQuantity)
	{
		uActualQuantity		= uQuantityRemaining;
		m_uCurrentQuantity	= 0;
	}
	else
	{
		m_uCurrentQuantity	-= uQuantity;
		uActualQuantity		 = uQuantity;
	}

	// Return the quantity actually modified...
	return(uActualQuantity);
}

inline u_int AVP_Inventory_Item_QuantityData::IncreaseQuantity(const u_int uQuantity)
{
	const u_int	uQuantityRemaining	= m_uMaxQuantity - m_uCurrentQuantity;

	u_int		uActualQuantity;

	// Are we able to remove all of them?
	if(uQuantityRemaining < uQuantity)
	{
		uActualQuantity		= uQuantityRemaining;
		m_uCurrentQuantity	= m_uMaxQuantity;
	}
	else
	{
		m_uCurrentQuantity	+= uQuantity;
		uActualQuantity		 = uQuantity;
	}

	// Return the quantity actually modified...
	return(uActualQuantity);
}


#endif   // ifndef __AVP_INVENTORY_ITEM_QUANTITYDATA_H__


/// End of file. ///
