cloak::cloak() { }
cloak::~cloak() { }
int cloak::peek() const
{
if (tags_.empty())
{
return 1;
}
int n = *tags_.begin();
if (n <= 0)
{
return n - 0x80000000;
}
else
{
return *tags_.rbegin() + 1;
}
}
int cloak::acquire()
{
return *(tags_.insert(peek()).first);
}
bool cloak::release(int n)
{
if (tags_.erase(n) != 0)
{
tags_.insert(0x80000000 + n);
return true;
}
else
{
return false;
}
}
void cloak::clear()
{
tags_.clear();
}
template<typename Iterator>
Iterator cloak::acquired(Iterator out) const
{
if (tags_.empty())
{
return out;
}
for (int n = 1; n <= *tags_.rbegin(); n++)
{
if (tags_.count(n) != 0)
{
(*out) = n;
++out;
}
}
return out;
}
template<typename Iterator>
Iterator cloak::released(Iterator out) const
{
if (tags_.empty())
{
return out;
}
for (int n = 1; n <= *tags_.rbegin(); n++)
{
if (tags_.count(n) == 0)
{
(*out) = n;
++out;
}
}
return out;
}