]> sigrok.org Git - pulseview.git/commitdiff
Added tests, and corrected behaviour of LogicDataSnapshot::pow2_ceil
authorJoel Holdsworth <redacted>
Sat, 15 Sep 2012 12:31:14 +0000 (13:31 +0100)
committerJoel Holdsworth <redacted>
Sat, 15 Sep 2012 12:31:14 +0000 (13:31 +0100)
logicdatasnapshot.cpp
logicdatasnapshot.h
test/logicdatasnapshot.cpp

index e751b9d1cd6ae3528311913b7a284fdafaa123b2..5301abf59d04d6920892a5b6bfaa143ebf04c9ad 100644 (file)
@@ -323,7 +323,8 @@ void LogicDataSnapshot::get_subsampled_edges(
                get_sample(end) & sig_mask));
 }
 
-int64_t LogicDataSnapshot::pow2_ceil(int64_t x, int power)
+int64_t LogicDataSnapshot::pow2_ceil(int64_t x, unsigned int power)
 {
-       return ((x >> power) + 1) << power;
+       const int64_t p = 1 << power;
+       return ((x < 0) ? x : (x + p - 1)) / p * p;
 }
index 630aad431879ebfe90a4df192e304dda174b6ad2..de0f4732bf28fb1c949a904b0c0364cb2ef1aaa1 100644 (file)
@@ -24,6 +24,7 @@
 #include <vector>
 
 namespace LogicDataSnapshotTest {
+       class Pow2;
        class Basic;
        class LargeData;
 }
@@ -79,12 +80,13 @@ public:
 
 private:
 
-       static inline int64_t pow2_ceil(int64_t x, int power);
+       static int64_t pow2_ceil(int64_t x, unsigned int power);
 
 private:
        struct MipMapLevel _mip_map[ScaleStepCount];
        uint64_t _last_append_sample;
 
+       friend class LogicDataSnapshotTest::Pow2;
        friend class LogicDataSnapshotTest::Basic;
        friend class LogicDataSnapshotTest::LargeData;
 };
index 6e1f26364d778feb7e16a0e1a8edb306c1d6410a..66232cd6975be057bb6f9fa3d1cf7b4e027da037 100644 (file)
@@ -18,6 +18,9 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
  */
 
+#define __STDC_LIMIT_MACROS
+#include <stdint.h>
+
 #include <boost/test/unit_test.hpp>
 
 #include "../logicdatasnapshot.h"
@@ -37,6 +40,28 @@ void push_logic(LogicDataSnapshot &s, unsigned int length, uint8_t value)
        delete[] (uint8_t*)logic.data;
 }
 
+BOOST_AUTO_TEST_CASE(Pow2)
+{
+       BOOST_CHECK_EQUAL(LogicDataSnapshot::pow2_ceil(-2, 0), -2);
+       BOOST_CHECK_EQUAL(LogicDataSnapshot::pow2_ceil(-1, 0), -1);
+       BOOST_CHECK_EQUAL(LogicDataSnapshot::pow2_ceil(0, 0), 0);
+       BOOST_CHECK_EQUAL(LogicDataSnapshot::pow2_ceil(1, 0), 1);
+       BOOST_CHECK_EQUAL(LogicDataSnapshot::pow2_ceil(2, 0), 2);
+
+       BOOST_CHECK_EQUAL(
+               LogicDataSnapshot::pow2_ceil(INT64_MIN, 0), INT64_MIN);
+       BOOST_CHECK_EQUAL(
+               LogicDataSnapshot::pow2_ceil(INT64_MAX, 0), INT64_MAX);
+
+       BOOST_CHECK_EQUAL(LogicDataSnapshot::pow2_ceil(-3, 1), -2);
+       BOOST_CHECK_EQUAL(LogicDataSnapshot::pow2_ceil(-2, 1), -2);
+       BOOST_CHECK_EQUAL(LogicDataSnapshot::pow2_ceil(-1, 1), 0);
+       BOOST_CHECK_EQUAL(LogicDataSnapshot::pow2_ceil(0, 1), 0);
+       BOOST_CHECK_EQUAL(LogicDataSnapshot::pow2_ceil(1, 1), 2);
+       BOOST_CHECK_EQUAL(LogicDataSnapshot::pow2_ceil(2, 1), 2);
+       BOOST_CHECK_EQUAL(LogicDataSnapshot::pow2_ceil(3, 1), 4);
+}
+
 BOOST_AUTO_TEST_CASE(Basic)
 {
        // Create an empty LogicDataSnapshot object