TransferID::subtracted()

This commit is contained in:
Pavel Kirienko
2015-07-20 12:32:13 +03:00
parent 29c295bf11
commit c36fdb2156
3 changed files with 37 additions and 1 deletions
@@ -104,6 +104,11 @@ public:
* Amount of increment() calls to reach rhs value.
*/
int computeForwardDistance(TransferID rhs) const;
/**
* Difference between two TransferID values with proper wraparound handling.
*/
int subtracted(TransferID rhs) const;
};
+7
View File
@@ -52,4 +52,11 @@ int TransferID::computeForwardDistance(TransferID rhs) const
return d;
}
int TransferID::subtracted(TransferID rhs) const
{
const int x = rhs.computeForwardDistance(*this);
return (x >= ((1 << BitLen) / 2)) ? (x - (1 << BitLen)) : x;
}
}
+25 -1
View File
@@ -15,7 +15,7 @@ TEST(Transfer, TransferID)
ASSERT_EQ(32, 1 << TransferID::BitLen);
/*
* forwardDistance()
* computeForwardDistance()
*/
EXPECT_EQ(0, TransferID(0).computeForwardDistance(0));
EXPECT_EQ(1, TransferID(0).computeForwardDistance(1));
@@ -28,6 +28,30 @@ TEST(Transfer, TransferID)
EXPECT_EQ(30,TransferID(7).computeForwardDistance(5));
EXPECT_EQ(5, TransferID(0).computeForwardDistance(5));
/*
* subtracted()
*/
EXPECT_EQ(0, TransferID(0).subtracted(0));
EXPECT_EQ(-1, TransferID(0).subtracted(1));
EXPECT_EQ(-7, TransferID(0).subtracted(7));
EXPECT_EQ(0, TransferID(7).subtracted(7));
EXPECT_EQ(1, TransferID(31).subtracted(30));
EXPECT_EQ(-1, TransferID(31).subtracted(0));
EXPECT_EQ(2, TransferID(7).subtracted(5));
EXPECT_EQ(-5, TransferID(0).subtracted(5));
EXPECT_EQ(-1, TransferID(15).subtracted(16));
EXPECT_EQ(1, TransferID(16).subtracted(15));
EXPECT_EQ(-16, TransferID(10).subtracted(26));
EXPECT_EQ(14, TransferID(24).subtracted(10));
EXPECT_EQ(15, TransferID(25).subtracted(10));
EXPECT_EQ(-16, TransferID(26).subtracted(10));
EXPECT_EQ(-15, TransferID(27).subtracted(10));
EXPECT_EQ(-14, TransferID(28).subtracted(10));
/*
* Misc
*/