void AddressRangeListTest::testAddJoinableRanges()
{
    AddressRangeList addressRangeList;

    AddressRange addressRange1( Start1, End1 );
    AddressRange addressRange2( Start2, End2 );
    // in front
    AddressRange otherAddressRange( 0, Start1-1 );
    addressRangeList.addAddressRange( addressRange1 );
    addressRangeList.addAddressRange( addressRange2 );
    addressRangeList.addAddressRange( otherAddressRange );

    QCOMPARE( addressRangeList.size(), 2 );
    QCOMPARE( addressRangeList.first(), AddressRange(otherAddressRange.start(),addressRange1.end()) );
    QCOMPARE( addressRangeList.last(), addressRange2 );

    // in the middle, with first
    addressRangeList.clear();
    otherAddressRange.set( End1+1, Start2-2 );
    addressRangeList.addAddressRange( addressRange1 );
    addressRangeList.addAddressRange( addressRange2 );
    addressRangeList.addAddressRange( otherAddressRange );

    QCOMPARE( addressRangeList.size(), 2 );
    QCOMPARE( addressRangeList.first(), AddressRange(addressRange1.start(),otherAddressRange.end()) );
    QCOMPARE( addressRangeList.last(), addressRange2 );

    // in the middle, with both
    addressRangeList.clear();
    otherAddressRange.set( End1+1, Start2-1 );
    addressRangeList.addAddressRange( addressRange1 );
    addressRangeList.addAddressRange( addressRange2 );
    addressRangeList.addAddressRange( otherAddressRange );

    QCOMPARE( addressRangeList.size(), 1 );
    QCOMPARE( addressRangeList.first(), AddressRange(addressRange1.start(),addressRange2.end()) );

    // in the middle, with last
    addressRangeList.clear();
    otherAddressRange.set( End1+2, Start2-1 );
    addressRangeList.addAddressRange( addressRange1 );
    addressRangeList.addAddressRange( addressRange2 );
    addressRangeList.addAddressRange( otherAddressRange );

    QCOMPARE( addressRangeList.size(), 2 );
    QCOMPARE( addressRangeList.first(), addressRange1 );
    QCOMPARE( addressRangeList.last(), AddressRange(otherAddressRange.start(),addressRange2.end()) );

    // behind
    addressRangeList.clear();
    otherAddressRange.setByWidth( End2+1, Width );
    addressRangeList.addAddressRange( addressRange1 );
    addressRangeList.addAddressRange( addressRange2 );
    addressRangeList.addAddressRange( otherAddressRange );

    QCOMPARE( addressRangeList.size(), 2 );
    QCOMPARE( addressRangeList.first(), addressRange1 );
    QCOMPARE( addressRangeList.last(), AddressRange(addressRange2.start(),otherAddressRange.end()) );
}
AddressRange RemovePieceTableChange::apply( PieceTable* pieceTable ) const
{
    const Address oldLast = pieceTable->size() - 1;

    pieceTable->remove( mRemoveRange );

    return AddressRange( mRemoveRange.start(), oldLast );
}
AbstractPieceTableChange* ReplacePieceTableChangeAbstractPieceTableChangeIfTest::createPieceTableChange()
{
    const Piece replacedPiece( AddressRange::fromWidth(Start+ChangeStorageOffset,Width), Piece::ChangeStorage );

    ReplacePieceTableChange* pieceTableChange =
        new ReplacePieceTableChange( AddressRange(Start,End), InsertLength, InsertStorageOffset,
                                              PieceList(replacedPiece) );

    return pieceTableChange;
}
示例#4
0
AddressRange JSONConfig::getAddressRangeForFunc(const std::string &func) const {
	const auto &f = impl->getConfigFunctionByNameOrEmptyFunction(func);
	auto startAddress = f.getStart();
	auto endAddress = f.getEnd();
	if (startAddress.isUndefined() || endAddress.isUndefined()) {
		return NO_ADDRESS_RANGE;
	}

	return AddressRange(startAddress.getValue(), endAddress.getValue());
}
示例#5
0
void AddressRangeTest::testSubRange()
{
    AddressRange addressRange( Start, End );

    AddressRange subRange = addressRange.subRange( AddressRange::fromWidth(Width) );
    QCOMPARE( subRange.start(), Start );
    QCOMPARE( subRange.end(), End );

    subRange = addressRange.subRange( AddressRange(1,Width-1) );
    QCOMPARE( subRange.start(), Start+1 );
    QCOMPARE( subRange.end(), End );

    subRange = addressRange.subRange( AddressRange(0,Width-2) );
    QCOMPARE( subRange.start(), Start );
    QCOMPARE( subRange.end(), End-1 );

    subRange = addressRange.subRange( AddressRange(1,Width-2) );
    QCOMPARE( subRange.start(), Start+1 );
    QCOMPARE( subRange.end(), End-1 );
}
示例#6
0
void AddressRangeTest::testLocalRange()
{
    AddressRange addressRange( Start, End );

    AddressRange localRange = addressRange.localRange( AddressRange(Start,End) );
    QCOMPARE( localRange.start(), 0 );
    QCOMPARE( localRange.end(), Width-1 );

    localRange = addressRange.localRange( AddressRange(Start+1,End) );
    QCOMPARE( localRange.start(), 1 );
    QCOMPARE( localRange.end(), Width-1 );

    localRange = addressRange.localRange( AddressRange(Start,End-1) );
    QCOMPARE( localRange.start(), 0 );
    QCOMPARE( localRange.end(), Width-2 );

    localRange = addressRange.localRange( AddressRange(Start+1,End-1) );
    QCOMPARE( localRange.start(), 1 );
    QCOMPARE( localRange.end(), Width-2 );
}
示例#7
0
 void IRQs::Write(const IO::common_busses_t& busses)
 {
   if(AddressRange() == busses.physical_address)
     switch(busses.address & 1)
     {
       case 0:
         active.timer = 0; // disable timer
         break;
       case 1:
         to_u8(enabled) = (busses.data & 0x07) ^ 0x07; // set which IRQs are enabled (input is which IRQs are disabled)
     }
 }
示例#8
0
 void IRQs::Read (IO::common_busses_t& busses)
 {
   if(AddressRange() == busses.physical_address)
     switch(busses.address & 1)
     {
       case 0: // disable timer on read
         active.timer = 0;
         break;
       case 1: // return which IRQs are disabled (inverse of which are enabled)
         busses.data = to_u8(enabled) ^ 0x07;
     }
 }
示例#9
0
std::vector<AddressRange> IdaFrontend::functionAddresses(ByteAddr address) {
    std::vector<AddressRange> result;

    ea_t func_ea = checked_cast<ea_t>(address);
    func_t *function = ::get_func(func_ea);

    if (!function) {
        return result;
    }

    auto startAddr = checked_cast<ByteAddr>(function->startEA);
    auto endAddr = checked_cast<ByteAddr>(function->endEA);
    result.push_back(AddressRange(startAddr, endAddr));

    for (int i = 0; i < function->tailqty; ++i) {
        auto chunkStartAddr = checked_cast<ByteAddr>(function->tails[i].startEA);
        auto chunkEndAddr = checked_cast<ByteAddr>(function->tails[i].endEA);
        result.push_back(AddressRange(chunkStartAddr, chunkEndAddr));
    }
    
    return result;
}
示例#10
0
 void Timer::Write(const IO::common_busses_t& busses)
 {
   if(AddressRange() == busses.physical_address)
   {
     if(!m_enabled && (busses.data & 0x01)) // if enabling
     {
       m_cycle_counter = 0;
       m_cycle_counter -= 1; // set max value
       m_timer_counter = m_timer_latch;
     }
     m_enabled = busses.data & 0x01;
   }
 }
void ReplacePieceTableChangeAbstractPieceTableChangeIfTest::changePieceTable( PieceTable *pieceTable )
{
    pieceTable->replace( AddressRange(Start,End), InsertLength, InsertStorageOffset );
}
void RevertablePieceTableTest::testRemove()
{
    RevertablePieceTable pieceTable;

    int changeStarts[6];
    int storageId;
    int storageOffset;
    bool result;

    // removing at begin
    pieceTable.init( BaseSize );
    pieceTable.remove( AddressRange(0, Start-1) );

        QCOMPARE( pieceTable.size(), BaseSize-Start );
        QCOMPARE( pieceTable.changesCount(), 1 );
        QCOMPARE( pieceTable.appliedChangesCount(), 1 );

        result = pieceTable.getStorageData( &storageId, &storageOffset, 0 );
        QVERIFY( result );
        QCOMPARE( storageOffset, Start );
        QCOMPARE( storageId, (int)Piece::OriginalStorage );

        result = pieceTable.getStorageData( &storageId, &storageOffset, BaseSize-Start-1 );
        QVERIFY( result );
        QCOMPARE( storageOffset, BaseSize-1 );
        QCOMPARE( storageId, (int)Piece::OriginalStorage );

        result = pieceTable.getStorageData( &storageId, &storageOffset, BaseSize-Start );
        QVERIFY( !result );

    // removing at middle
    pieceTable.init( BaseSize );
    pieceTable.remove( AddressRange(Start, End) );

        QCOMPARE( pieceTable.size(), BaseSize-Width );
        QCOMPARE( pieceTable.changesCount(), 1 );
        QCOMPARE( pieceTable.appliedChangesCount(), 1 );

        result = pieceTable.getStorageData( &storageId, &storageOffset, Start-1 );
        QVERIFY( result );
        QCOMPARE( storageOffset, Start-1 );
        QCOMPARE( storageId, (int)Piece::OriginalStorage );

        result = pieceTable.getStorageData( &storageId, &storageOffset, Start );
        QVERIFY( result );
        QCOMPARE( storageOffset, End+1 );
        QCOMPARE( storageId, (int)Piece::OriginalStorage );

        result = pieceTable.getStorageData( &storageId, &storageOffset, BaseSize-Width-1 );
        QVERIFY( result );
        QCOMPARE( storageOffset, BaseSize-1 );
        QCOMPARE( storageId, (int)Piece::OriginalStorage );

        result = pieceTable.getStorageData( &storageId, &storageOffset, BaseSize-Width );
        QVERIFY( !result );

    // removing at end
    pieceTable.init( BaseSize );
    pieceTable.remove( AddressRange(End+1, BaseSize-1) );

        QCOMPARE( pieceTable.size(), End+1 );
        QCOMPARE( pieceTable.changesCount(), 1 );
        QCOMPARE( pieceTable.appliedChangesCount(), 1 );

        result = pieceTable.getStorageData( &storageId, &storageOffset, End );
        QVERIFY( result );
        QCOMPARE( storageOffset, End );
        QCOMPARE( storageId, (int)Piece::OriginalStorage );

        result = pieceTable.getStorageData( &storageId, &storageOffset, End+1 );
        QVERIFY( !result );

    // removing all
    pieceTable.init( BaseSize );
    pieceTable.remove( AddressRange::fromWidth(BaseSize) );

        QCOMPARE( pieceTable.size(), 0 );
        QCOMPARE( pieceTable.changesCount(), 1 );
        QCOMPARE( pieceTable.appliedChangesCount(), 1 );

        result = pieceTable.getStorageData( &storageId, &storageOffset, 0 );
        QVERIFY( !result );


    // removing a lot:
    const int pieceCount = 5;
    const int mid = (pieceCount+1)/2;
    const int midPieceOffset = BaseSize * (mid-1);
    const int fullSize = pieceCount * BaseSize;
    // for this five equally sized pieces are inserted, reverse to offset in ChangeStore
    for( int i=0; i<pieceCount; ++i ) changeStarts[pieceCount-i] = BaseSize*i;

    // removing inside a piece in the middle
    fillWithSize( &pieceTable, pieceCount );
    pieceTable.remove( AddressRange::fromWidth(midPieceOffset+Start, Width) );

        QCOMPARE( pieceTable.size(), fullSize-Width );
        QCOMPARE( pieceTable.changesCount(), pieceCount+1 );
        QCOMPARE( pieceTable.appliedChangesCount(), pieceCount+1 );

        result = pieceTable.getStorageData( &storageId, &storageOffset, midPieceOffset+Start-1 );
        QVERIFY( result );
        QCOMPARE( storageOffset, changeStarts[mid]+Start-1 );
        QCOMPARE( storageId, (int)Piece::ChangeStorage );

        result = pieceTable.getStorageData( &storageId, &storageOffset, midPieceOffset+Start );
        QVERIFY( result );
        QCOMPARE( storageOffset, changeStarts[mid]+End+1 );
        QCOMPARE( storageId, (int)Piece::ChangeStorage );

        result = pieceTable.getStorageData( &storageId, &storageOffset, fullSize-Width-1 );
        QVERIFY( result );
        QCOMPARE( storageOffset, changeStarts[pieceCount]+BaseSize-1 );
        QCOMPARE( storageId, (int)Piece::ChangeStorage );

        result = pieceTable.getStorageData( &storageId, &storageOffset, fullSize-Width );
        QVERIFY( !result );

    // removing start of a piece in the middle
    fillWithSize( &pieceTable, pieceCount );
    pieceTable.remove( AddressRange::fromWidth(midPieceOffset, Start) );

        QCOMPARE( pieceTable.size(), fullSize-Start );
        QCOMPARE( pieceTable.changesCount(), pieceCount+1 );
        QCOMPARE( pieceTable.appliedChangesCount(), pieceCount+1 );

        result = pieceTable.getStorageData( &storageId, &storageOffset, midPieceOffset-1 );
        QVERIFY( result );
        QCOMPARE( storageOffset, changeStarts[mid-1]+BaseSize-1 );
        QCOMPARE( storageId, (int)Piece::ChangeStorage );

        result = pieceTable.getStorageData( &storageId, &storageOffset, midPieceOffset );
        QVERIFY( result );
        QCOMPARE( storageOffset, changeStarts[mid]+Start );
        QCOMPARE( storageId, (int)Piece::ChangeStorage );

        result = pieceTable.getStorageData( &storageId, &storageOffset, fullSize-Start-1 );
        QVERIFY( result );
        QCOMPARE( storageOffset, changeStarts[pieceCount]+BaseSize-1 );
        QCOMPARE( storageId, (int)Piece::ChangeStorage );

        result = pieceTable.getStorageData( &storageId, &storageOffset, fullSize-Start );
        QVERIFY( !result );

    // removing end of a piece in the middle
    fillWithSize( &pieceTable, pieceCount );
    pieceTable.remove( AddressRange::fromWidth(midPieceOffset+End+1, BaseSize-(End+1)) );

        QCOMPARE( pieceTable.size(), fullSize-(BaseSize-End-1) );
        QCOMPARE( pieceTable.changesCount(), pieceCount+1 );
        QCOMPARE( pieceTable.appliedChangesCount(), pieceCount+1 );

        result = pieceTable.getStorageData( &storageId, &storageOffset, midPieceOffset+End );
        QVERIFY( result );
        QCOMPARE( storageOffset, changeStarts[mid]+End );
        QCOMPARE( storageId, (int)Piece::ChangeStorage );

        result = pieceTable.getStorageData( &storageId, &storageOffset, midPieceOffset+End+1 );
        QVERIFY( result );
        QCOMPARE( storageOffset, changeStarts[mid+1] );
        QCOMPARE( storageId, (int)Piece::ChangeStorage );

        result = pieceTable.getStorageData( &storageId, &storageOffset, fullSize-(BaseSize-End-1)-1 );
        QVERIFY( result );
        QCOMPARE( storageOffset, changeStarts[pieceCount]+BaseSize-1 );
        QCOMPARE( storageId, (int)Piece::ChangeStorage );

        result = pieceTable.getStorageData( &storageId, &storageOffset, fullSize-(BaseSize-End-1) );
        QVERIFY( !result );

    // removing whole piece in the middle
    fillWithSize( &pieceTable, pieceCount );
    pieceTable.remove( AddressRange::fromWidth(midPieceOffset, BaseSize) );

        QCOMPARE( pieceTable.size(), fullSize-BaseSize );
        QCOMPARE( pieceTable.changesCount(), pieceCount+1 );
        QCOMPARE( pieceTable.appliedChangesCount(), pieceCount+1 );

        result = pieceTable.getStorageData( &storageId, &storageOffset, midPieceOffset-1 );
        QVERIFY( result );
        QCOMPARE( storageOffset, changeStarts[mid-1]+BaseSize-1 );
        QCOMPARE( storageId, (int)Piece::ChangeStorage );

        result = pieceTable.getStorageData( &storageId, &storageOffset, midPieceOffset );
        QVERIFY( result );
        QCOMPARE( storageOffset, changeStarts[mid+1] );
        QCOMPARE( storageId, (int)Piece::ChangeStorage );

        result = pieceTable.getStorageData( &storageId, &storageOffset, fullSize-BaseSize-1 );
        QVERIFY( result );
        QCOMPARE( storageOffset, changeStarts[pieceCount]+BaseSize-1 );
        QCOMPARE( storageId, (int)Piece::ChangeStorage );

        result = pieceTable.getStorageData( &storageId, &storageOffset, fullSize-BaseSize );
        QVERIFY( !result );

    // removing whole piece and start of next in the middke
    fillWithSize( &pieceTable, pieceCount );
    pieceTable.remove( AddressRange::fromWidth(midPieceOffset, BaseSize+Start) );

        QCOMPARE( pieceTable.size(), fullSize-BaseSize-Start );
        QCOMPARE( pieceTable.changesCount(), pieceCount+1 );
        QCOMPARE( pieceTable.appliedChangesCount(), pieceCount+1 );

        result = pieceTable.getStorageData( &storageId, &storageOffset, midPieceOffset-1 );
        QVERIFY( result );
        QCOMPARE( storageOffset, changeStarts[mid-1]+BaseSize-1 );
        QCOMPARE( storageId, (int)Piece::ChangeStorage );

        result = pieceTable.getStorageData( &storageId, &storageOffset, midPieceOffset );
        QVERIFY( result );
        QCOMPARE( storageOffset, changeStarts[mid+1]+Start );
        QCOMPARE( storageId, (int)Piece::ChangeStorage );

        result = pieceTable.getStorageData( &storageId, &storageOffset, fullSize-BaseSize-Start-1 );
        QVERIFY( result );
        QCOMPARE( storageOffset, changeStarts[pieceCount]+BaseSize-1 );
        QCOMPARE( storageId, (int)Piece::ChangeStorage );

        result = pieceTable.getStorageData( &storageId, &storageOffset, fullSize-BaseSize-Start );
        QVERIFY( !result );

    // removing whole piece and end of previous in the middle
    fillWithSize( &pieceTable, pieceCount );
    pieceTable.remove( AddressRange::fromWidth(midPieceOffset-(BaseSize-End-1), BaseSize+BaseSize-(End+1)) );

        QCOMPARE( pieceTable.size(), fullSize-BaseSize-(BaseSize-End-1) );
        QCOMPARE( pieceTable.changesCount(), pieceCount+1 );
        QCOMPARE( pieceTable.appliedChangesCount(), pieceCount+1 );

        result = pieceTable.getStorageData( &storageId, &storageOffset, midPieceOffset-(BaseSize-End-1)-1 );
        QVERIFY( result );
        QCOMPARE( storageOffset, changeStarts[mid-1]+End );
        QCOMPARE( storageId, (int)Piece::ChangeStorage );

        result = pieceTable.getStorageData( &storageId, &storageOffset, midPieceOffset-(BaseSize-End-1) );
        QVERIFY( result );
        QCOMPARE( storageOffset, changeStarts[mid+1] );
        QCOMPARE( storageId, (int)Piece::ChangeStorage );

        result = pieceTable.getStorageData( &storageId, &storageOffset, fullSize-BaseSize-(BaseSize-End-1)-1 );
        QVERIFY( result );
        QCOMPARE( storageOffset, changeStarts[pieceCount]+BaseSize-1 );
        QCOMPARE( storageId, (int)Piece::ChangeStorage );

        result = pieceTable.getStorageData( &storageId, &storageOffset, fullSize-BaseSize-(BaseSize-End-1) );
        QVERIFY( !result );

    // removing end of previous, whole and start of next in the middle
    fillWithSize( &pieceTable, pieceCount );
    pieceTable.remove( AddressRange::fromWidth(midPieceOffset-(BaseSize-End-1), Start+BaseSize+BaseSize-(End+1)) );

        QCOMPARE( pieceTable.size(), fullSize-BaseSize-(BaseSize-End-1)-Start );
        QCOMPARE( pieceTable.changesCount(), pieceCount+1 );
        QCOMPARE( pieceTable.appliedChangesCount(), pieceCount+1 );

        result = pieceTable.getStorageData( &storageId, &storageOffset, midPieceOffset-(BaseSize-End-1)-1 );
        QVERIFY( result );
        QCOMPARE( storageOffset, changeStarts[mid-1]+BaseSize-(BaseSize-End-1)-1 );
        QCOMPARE( storageId, (int)Piece::ChangeStorage );

        result = pieceTable.getStorageData( &storageId, &storageOffset, midPieceOffset-(BaseSize-End-1) );
        QVERIFY( result );
        QCOMPARE( storageOffset, changeStarts[mid+1]+Start );
        QCOMPARE( storageId, (int)Piece::ChangeStorage );

        result = pieceTable.getStorageData( &storageId, &storageOffset, fullSize-BaseSize-(BaseSize-End-1)-Start-1 );
        QVERIFY( result );
        QCOMPARE( storageOffset, changeStarts[pieceCount]+BaseSize-1 );
        QCOMPARE( storageId, (int)Piece::ChangeStorage );

        result = pieceTable.getStorageData( &storageId, &storageOffset, fullSize-BaseSize-(BaseSize-End-1)-Start );
        QVERIFY( !result );

    // removing start of piece at start
    fillWithSize( &pieceTable, pieceCount );
    pieceTable.remove( AddressRange::fromWidth(Start) );

        QCOMPARE( pieceTable.size(), fullSize-Start );
        QCOMPARE( pieceTable.changesCount(), pieceCount+1 );
        QCOMPARE( pieceTable.appliedChangesCount(), pieceCount+1 );

        result = pieceTable.getStorageData( &storageId, &storageOffset, 0 );
        QVERIFY( result );
        QCOMPARE( storageOffset, changeStarts[1]+Start );
        QCOMPARE( storageId, (int)Piece::ChangeStorage );

        result = pieceTable.getStorageData( &storageId, &storageOffset, fullSize-Start-1 );
        QVERIFY( result );
        QCOMPARE( storageOffset, changeStarts[pieceCount]+BaseSize-1 );
        QCOMPARE( storageId, (int)Piece::ChangeStorage );

        result = pieceTable.getStorageData( &storageId, &storageOffset, fullSize-Start );
        QVERIFY( !result );

    // removing whole piece at start
    fillWithSize( &pieceTable, pieceCount );
    pieceTable.remove( AddressRange::fromWidth(BaseSize) );

        QCOMPARE( pieceTable.size(), fullSize-BaseSize );
        QCOMPARE( pieceTable.changesCount(), pieceCount+1 );
        QCOMPARE( pieceTable.appliedChangesCount(), pieceCount+1 );

        result = pieceTable.getStorageData( &storageId, &storageOffset, 0 );
        QVERIFY( result );
        QCOMPARE( storageOffset, changeStarts[2] );
        QCOMPARE( storageId, (int)Piece::ChangeStorage );

        result = pieceTable.getStorageData( &storageId, &storageOffset, fullSize-BaseSize-1 );
        QVERIFY( result );
        QCOMPARE( storageOffset, changeStarts[pieceCount]+BaseSize-1 );
        QCOMPARE( storageId, (int)Piece::ChangeStorage );

        result = pieceTable.getStorageData( &storageId, &storageOffset, fullSize-BaseSize );
        QVERIFY( !result );

    // removing whole piece and start of next at start
    fillWithSize( &pieceTable, pieceCount );
    pieceTable.remove( AddressRange::fromWidth(BaseSize+Start) );

        QCOMPARE( pieceTable.size(), fullSize-BaseSize-Start );
        QCOMPARE( pieceTable.changesCount(), pieceCount+1 );
        QCOMPARE( pieceTable.appliedChangesCount(), pieceCount+1 );

        result = pieceTable.getStorageData( &storageId, &storageOffset, 0 );
        QVERIFY( result );
        QCOMPARE( storageOffset, changeStarts[2]+Start );
        QCOMPARE( storageId, (int)Piece::ChangeStorage );

        result = pieceTable.getStorageData( &storageId, &storageOffset, fullSize-BaseSize-Start-1 );
        QVERIFY( result );
        QCOMPARE( storageOffset, changeStarts[pieceCount]+BaseSize-1 );
        QCOMPARE( storageId, (int)Piece::ChangeStorage );

        result = pieceTable.getStorageData( &storageId, &storageOffset, fullSize-BaseSize-Start );
        QVERIFY( !result );

    // removing end of piece at end
    fillWithSize( &pieceTable, pieceCount );
    pieceTable.remove( AddressRange::fromWidth(fullSize-BaseSize+End+1, BaseSize-(End+1)) );

        QCOMPARE( pieceTable.size(), fullSize-(BaseSize-End-1) );
        QCOMPARE( pieceTable.changesCount(), pieceCount+1 );
        QCOMPARE( pieceTable.appliedChangesCount(), pieceCount+1 );

        result = pieceTable.getStorageData( &storageId, &storageOffset, fullSize-BaseSize+End );
        QVERIFY( result );
        QCOMPARE( storageOffset, changeStarts[pieceCount]+End );
        QCOMPARE( storageId, (int)Piece::ChangeStorage );

        result = pieceTable.getStorageData( &storageId, &storageOffset, fullSize-(BaseSize-End-1) );
        QVERIFY( !result );

    // removing whole piece at end
    fillWithSize( &pieceTable, pieceCount );
    pieceTable.remove( AddressRange::fromWidth(fullSize-BaseSize, BaseSize) );

        QCOMPARE( pieceTable.size(), fullSize-BaseSize );
        QCOMPARE( pieceTable.changesCount(), pieceCount+1 );
        QCOMPARE( pieceTable.appliedChangesCount(), pieceCount+1 );

        result = pieceTable.getStorageData( &storageId, &storageOffset, fullSize-BaseSize-1 );
        QVERIFY( result );
        QCOMPARE( storageOffset, changeStarts[pieceCount-1]+BaseSize-1 );
        QCOMPARE( storageId, (int)Piece::ChangeStorage );

        result = pieceTable.getStorageData( &storageId, &storageOffset, fullSize-BaseSize );
        QVERIFY( !result );

    // removing whole piece and end of previous at end
    fillWithSize( &pieceTable, pieceCount );
    pieceTable.remove( AddressRange::fromWidth(fullSize-BaseSize-(BaseSize-End-1), BaseSize+BaseSize-(End+1)) );

        QCOMPARE( pieceTable.size(), fullSize-BaseSize-(BaseSize-End-1) );
        QCOMPARE( pieceTable.changesCount(), pieceCount+1 );
        QCOMPARE( pieceTable.appliedChangesCount(), pieceCount+1 );

        result = pieceTable.getStorageData( &storageId, &storageOffset, fullSize-BaseSize-(BaseSize-End-1)-1 );
        QVERIFY( result );
        QCOMPARE( storageOffset, changeStarts[pieceCount-1]+End );
        QCOMPARE( storageId, (int)Piece::ChangeStorage );

        result = pieceTable.getStorageData( &storageId, &storageOffset, fullSize-BaseSize-(BaseSize-End-1) );
        QVERIFY( !result );

    // removing all 
    fillWithSize( &pieceTable, pieceCount );
    pieceTable.remove( AddressRange::fromWidth(fullSize) );

        QCOMPARE( pieceTable.size(), 0 );
        QCOMPARE( pieceTable.changesCount(), pieceCount+1 );
        QCOMPARE( pieceTable.appliedChangesCount(), pieceCount+1 );

        result = pieceTable.getStorageData( &storageId, &storageOffset, 0 );
        QVERIFY( !result );
}
示例#13
0
 void Timer::Read (IO::common_busses_t& busses)
 {
   if(AddressRange() == busses.physical_address)
     busses.data = m_timer_counter;
 }
AddressRange RemovePieceTableChange::revert( PieceTable* pieceTable ) const
{
    pieceTable->insert( mRemoveRange.start(), mRemovedPieces );

    return AddressRange( mRemoveRange.start(), pieceTable->size()-1 );
}