📄 dimoneindex.cpp
字号:
#include "DimOneIndex.h"
namespace bmi {
DimOneIndex::DimOneIndex()
{
BITSET bs;
m_Bitmap.insert(BITMAP::value_type( MIN_KEY, bs));
m_Bitmap.insert(BITMAP::value_type( MAX_KEY, bs));
}
DimOneIndex::~DimOneIndex()
{
}
void DimOneIndex::Find(KEY _key, BITSET & bs)
{
BITMAP::iterator itUp = m_Bitmap.lower_bound(_key);
if ( itUp->first == _key )
{
bs = itUp->second;
}
else
{
BITMAP::iterator itDown = itUp;
--itDown;
bs = itDown->second & itUp->second;
}
}
void DimOneIndex::Find(KEY _down, KEY _up, bool bPart, BITSET & bs)
{
BITMAP::iterator itDown = m_Bitmap.lower_bound(_down);
BITMAP::iterator itUp = m_Bitmap.upper_bound(_up);
BITMAP::iterator it;
for ( it = itDown; it != itUp; ++it )
{
bs.operator|=( it->second );
}
if ( bPart )
{
if( itDown == itUp )
{
--itDown;
bs = itDown->second & itUp->second;
}
}
else
{
bs.operator&=( ~(itDown->second | itUp->second) );
}
}
void DimOneIndex::Add(OID _oid, KEY _key)
{
BITMAP::iterator itUp = m_Bitmap.lower_bound(_key);
if ( itUp->first == _key )
{
itUp->second.set(_oid, true);
}
else
{
BITMAP::iterator itDown = itUp;
--itDown;
BITSET bs = itDown->second & itUp->second;
bs.set(_oid, true);
m_Bitmap.insert(BITMAP::value_type(_key, bs));
}
}
void DimOneIndex::Add(OID _oid, KEY _down, KEY _up)
{
if ( _down == _up )
{
Add(_oid, _down);
return;
}
Add(_oid, _down);
Add(_oid, _up);
BITMAP::iterator itDown = m_Bitmap.find( _down);
BITMAP::iterator itUp = m_Bitmap.find( _up);
for ( ++itDown; itDown != itUp; ++itDown)
{
itDown->second.set(_oid, true);
}
}
bool DimOneIndex::Del(OID _oid, KEY _key)
{
BITMAP::iterator it = m_Bitmap.find( _key);
if ( m_Bitmap.end() != it )
{
it->second.set( _oid, false);
remove(it);
return true;
}
return false;
}
bool DimOneIndex::Del(OID _oid, KEY _down, KEY _up)
{
if ( _down == _up )
{
return Del(_oid, _down);
}
BITMAP::iterator itDown = m_Bitmap.find( _down );
if ( m_Bitmap.end() == itDown ) { return false; }
BITMAP::iterator itUp = m_Bitmap.find( _up );
if ( m_Bitmap.end() == itUp ) { return false; }
itUp->second.set( _oid, false);
BITMAP::iterator it = itDown;
for ( ; it != itUp; ++it)
{
it->second.set( _oid, false);
}
remove(itDown);
remove(itUp);
return true;
}
void DimOneIndex::remove(BITMAP::iterator & it){
BITMAP::iterator itDown = it;
--itDown;
BITMAP::iterator itUp = it;
++itUp;
BITSET a = itDown->second & it->second;
BITSET b = it->second & itUp->second;
if ( a == b )
{
m_Bitmap.erase( it );
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -