2018-11-01 03:36:01 -07:00
|
|
|
#pragma once
|
|
|
|
|
|
2018-12-13 22:18:52 -08:00
|
|
|
// void(_ObjType object, _OffsetType offset, _SizeType size)
|
|
|
|
|
template<typename _ObjType, typename _OffsetType, typename _SizeType, typename _FunctorType>
|
2018-11-01 03:36:01 -07:00
|
|
|
class RangeCombiner
|
|
|
|
|
{
|
|
|
|
|
public:
|
2018-12-13 22:18:52 -08:00
|
|
|
RangeCombiner(_FunctorType functor)
|
2018-11-01 03:36:01 -07:00
|
|
|
: _functor(functor)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void push(_ObjType object, _OffsetType offset, _SizeType size)
|
|
|
|
|
{
|
|
|
|
|
if (_size > 0 && _object == object && _offset + _size == offset) {
|
|
|
|
|
_size += size;
|
|
|
|
|
} else {
|
|
|
|
|
flush();
|
|
|
|
|
|
|
|
|
|
_object = object;
|
|
|
|
|
_offset = offset;
|
|
|
|
|
_size = size;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void flush()
|
|
|
|
|
{
|
|
|
|
|
if (_size == 0) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_functor(_object, _offset, _size);
|
|
|
|
|
|
|
|
|
|
_object = {};
|
|
|
|
|
_offset = {};
|
|
|
|
|
_size = {};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected:
|
2018-12-13 22:18:52 -08:00
|
|
|
_FunctorType _functor = nullptr;
|
2018-11-01 03:36:01 -07:00
|
|
|
_ObjType _object = {};
|
|
|
|
|
_OffsetType _offset = {};
|
|
|
|
|
_SizeType _size = {};
|
|
|
|
|
};
|
|
|
|
|
|
2018-12-13 22:18:52 -08:00
|
|
|
template<typename _ObjType, typename _OffsetType, typename _SizeType, typename _FunctorType>
|
|
|
|
|
static inline RangeCombiner<_ObjType, _OffsetType, _SizeType, _FunctorType>
|
|
|
|
|
makeRangeCombiner(_FunctorType functor)
|
|
|
|
|
{
|
|
|
|
|
return RangeCombiner<_ObjType, _OffsetType, _SizeType, _FunctorType>(functor);
|
2018-12-17 10:55:44 -08:00
|
|
|
}
|