#ifndef __LOCKLESS_TYPES_H
#define __LOCKLESS_TYPES_H

#include "Export.h"
#include "NativeTypes.h"
#include "WindowsIncludes.h"
#if defined(ANDROID) || defined(__S3E__)
// __sync_fetch_and_add not supported apparently
#include "SimpleMutex.h"
#endif

namespace RakNet
{

class RAK_DLL_EXPORT LocklessUint32_t
{
public:
	LocklessUint32_t();
	explicit LocklessUint32_t(uint32_t initial);
	// Returns variable value after changing it
	uint32_t Increment(void);
	// Returns variable value after changing it
	uint32_t Decrement(void);
	volatile uint32_t GetValue(void) const {return value;}

protected:
#ifdef _WIN32
	volatile LONG value;
#elif defined(ANDROID) || defined(__S3E__)
	// __sync_fetch_and_add not supported apparently
	SimpleMutex mutex;
	uint32_t value;
#else
	volatile uint32_t value;
#endif
};

};

#endif
