#ifndef _COMMON_REGSAM_HPP_
#define _COMMON_REGSAM_HPP_
#ifndef _COMMON_SHELLAPI_HPP_
#include <common/shellapi.hpp>
#endif

class RegSam
{
public:
	enum Sam{AllAccess=KEY_ALL_ACCESS,CreateLink=KEY_CREATE_LINK,CreateSubKey=KEY_CREATE_SUB_KEY,
			 EnumerateSubKeys=KEY_ENUMERATE_SUB_KEYS,Execute=KEY_EXECUTE,Notify=KEY_NOTIFY,
			 QueryValue=KEY_QUERY_VALUE,Read=KEY_READ,SetValue=KEY_SET_VALUE,Write=KEY_WRITE};
	RegSam(void);
	RegSam(Sam sam);
	RegSam(const RegSam &someRegSam);
	virtual ~RegSam();
	RegSam &operator=(const RegSam &someRegSam);
  RegSam &operator+=(Sam sam);
	WORD operator==(const RegSam &someRegSam);
  operator DWORD(void)const;
	DWORD regSam(void)const;
	void regSam(DWORD regSam);
private:
  DWORD mRegSam;
};

inline
RegSam::RegSam(void)
: mRegSam(AllAccess|Execute|Read|Write)
{
}

inline
RegSam::RegSam(Sam sam)
: mRegSam(sam)
{
}

inline
RegSam::RegSam(const RegSam &someRegSam)
{
  *this=someRegSam;
}

inline
RegSam::~RegSam()
{
}

inline
RegSam &RegSam::operator=(const RegSam &someRegSam)
{
	regSam(someRegSam.regSam());
	return *this;    
}

inline
RegSam &RegSam::operator+=(Sam sam)
{
	mRegSam|=sam;
  return *this;
}

inline
WORD RegSam::operator==(const RegSam &someRegSam)
{
  return regSam()==someRegSam.regSam();
}

inline
RegSam::operator DWORD(void)const
{
  return mRegSam;
}

inline
DWORD RegSam::regSam(void)const
{
	return mRegSam;
}

inline
void RegSam::regSam(DWORD regSam)
{
  mRegSam=regSam;
}
#endif