diff --git a/include/core/frame/frame_base.h b/include/core/frame/frame_base.h index 9050ea3203fa3084aa6b4fa36eccb1f789f867d0..fbdac3eb8d398055be5db4b995e2e9a029aac446 100644 --- a/include/core/frame/frame_base.h +++ b/include/core/frame/frame_base.h @@ -122,10 +122,10 @@ class FrameBase : public NodeBase, public HasStateBlocks, public std::enable_sha TrajectoryBaseConstPtr getTrajectory() const; TrajectoryBasePtr getTrajectory(); - FrameBaseConstPtr getPreviousFrame() const; - FrameBaseConstPtr getNextFrame() const; - FrameBasePtr getPreviousFrame(); - FrameBasePtr getNextFrame(); + FrameBaseConstPtr getPreviousFrame(const unsigned int& i = 1) const; + FrameBaseConstPtr getNextFrame(const unsigned int& i = 1) const; + FrameBasePtr getPreviousFrame(const unsigned int& i = 1); + FrameBasePtr getNextFrame(const unsigned int& i = 1); CaptureBaseConstPtrList getCaptureList() const; CaptureBasePtrList getCaptureList(); diff --git a/include/core/trajectory/trajectory_base.h b/include/core/trajectory/trajectory_base.h index 2b6c9cc6c645205f16e63db4d92bc146daacdc34..cc6a8abafc9e65062fc2a83580977b9bb4193658 100644 --- a/include/core/trajectory/trajectory_base.h +++ b/include/core/trajectory/trajectory_base.h @@ -59,10 +59,10 @@ class TrajectoryBase : public NodeBase, public std::enable_shared_from_this<Traj FrameBasePtr getLastFrame(); FrameBaseConstPtr getFirstFrame() const; FrameBasePtr getFirstFrame(); - FrameBaseConstPtr getNextFrame(FrameBaseConstPtr) const; - FrameBasePtr getNextFrame(FrameBasePtr); - FrameBaseConstPtr getPreviousFrame(FrameBaseConstPtr) const; - FrameBasePtr getPreviousFrame(FrameBasePtr); + FrameBaseConstPtr getNextFrame(FrameBaseConstPtr, const unsigned int& i = 1) const; + FrameBasePtr getNextFrame(FrameBasePtr, const unsigned int& i = 1); + FrameBaseConstPtr getPreviousFrame(FrameBaseConstPtr, const unsigned int& i = 1) const; + FrameBasePtr getPreviousFrame(FrameBasePtr, const unsigned int& i = 1); TimeStamp closestTimeStampToTimeStamp(const TimeStamp& _ts) const; FrameBaseConstPtr closestFrameToTimeStamp(const TimeStamp& _ts) const; FrameBasePtr closestFrameToTimeStamp(const TimeStamp& _ts); diff --git a/src/frame/frame_base.cpp b/src/frame/frame_base.cpp index 9467e1bc735328aa16217e7e47f12eb9204f68df..c76d30896265afe23200f194f872a27e7183dd10 100644 --- a/src/frame/frame_base.cpp +++ b/src/frame/frame_base.cpp @@ -156,32 +156,32 @@ bool FrameBase::getCovariance(Eigen::MatrixXd& _cov) const return getProblem()->getFrameCovariance(shared_from_this(), _cov); } -FrameBaseConstPtr FrameBase::getPreviousFrame() const +FrameBaseConstPtr FrameBase::getPreviousFrame(const unsigned int& i) const { assert(getTrajectory() != nullptr && "This Frame is not linked to any trajectory"); - return getTrajectory()->getPreviousFrame(shared_from_this()); + return getTrajectory()->getPreviousFrame(shared_from_this(), i); } -FrameBasePtr FrameBase::getPreviousFrame() +FrameBasePtr FrameBase::getPreviousFrame(const unsigned int& i) { assert(getTrajectory() != nullptr && "This Frame is not linked to any trajectory"); - return getTrajectory()->getPreviousFrame(shared_from_this()); + return getTrajectory()->getPreviousFrame(shared_from_this(), i); } -FrameBaseConstPtr FrameBase::getNextFrame() const +FrameBaseConstPtr FrameBase::getNextFrame(const unsigned int& i) const { assert(getTrajectory() != nullptr && "This Frame is not linked to any trajectory"); - return getTrajectory()->getNextFrame(shared_from_this()); + return getTrajectory()->getNextFrame(shared_from_this(), i); } -FrameBasePtr FrameBase::getNextFrame() +FrameBasePtr FrameBase::getNextFrame(const unsigned int& i) { assert(getTrajectory() != nullptr && "This Frame is not linked to any trajectory"); - return getTrajectory()->getNextFrame(shared_from_this()); + return getTrajectory()->getNextFrame(shared_from_this(), i); } CaptureBasePtr FrameBase::addCapture(CaptureBasePtr _capt_ptr) diff --git a/src/trajectory/trajectory_base.cpp b/src/trajectory/trajectory_base.cpp index 2e6748bcf9a77cf123cf2f35aff88223848eb993..d109846bcc45ded6add566208f05f9a6adc999a7 100644 --- a/src/trajectory/trajectory_base.cpp +++ b/src/trajectory/trajectory_base.cpp @@ -21,6 +21,7 @@ //--------LICENSE_END-------- #include "core/trajectory/trajectory_base.h" #include "core/frame/frame_base.h" +#include <iterator> namespace wolf { @@ -121,48 +122,52 @@ FrameBasePtr TrajectoryBase::closestFrameToTimeStamp(const TimeStamp& _ts) return nullptr; } -FrameBaseConstPtr TrajectoryBase::getNextFrame(FrameBaseConstPtr _frame) const +FrameBaseConstPtr TrajectoryBase::getNextFrame(FrameBaseConstPtr _frame, const unsigned int& i) const { auto frame_it = frame_const_map_.find(_frame->getTimeStamp()); WOLF_WARN_COND(frame_it == frame_const_map_.end(), "Frame not found in the frame map!"); - if (frame_it == frame_const_map_.end() or std::next(frame_it) == frame_const_map_.end()) + if (frame_it == frame_const_map_.end() or + std::distance(frame_it, frame_const_map_.end()) <= i) return nullptr; - return std::next(frame_it)->second; + return std::next(frame_it,i)->second; } -FrameBasePtr TrajectoryBase::getNextFrame(FrameBasePtr _frame) +FrameBasePtr TrajectoryBase::getNextFrame(FrameBasePtr _frame, const unsigned int& i) { auto frame_it = frame_map_.find(_frame->getTimeStamp()); WOLF_WARN_COND(frame_it == frame_map_.end(), "Frame not found in the frame map!"); - if (frame_it == frame_map_.end() or std::next(frame_it) == frame_map_.end()) + if (frame_it == frame_map_.end() or + std::distance(frame_it, frame_map_.end()) <= i) return nullptr; - return std::next(frame_it)->second; + return std::next(frame_it,i)->second; } -FrameBaseConstPtr TrajectoryBase::getPreviousFrame(FrameBaseConstPtr _frame) const +FrameBaseConstPtr TrajectoryBase::getPreviousFrame(FrameBaseConstPtr _frame, const unsigned int& i) const { auto frame_it = frame_const_map_.find(_frame->getTimeStamp()); WOLF_WARN_COND(frame_it == frame_const_map_.end(), "Frame not found in the frame map!"); - if (frame_it == frame_const_map_.end() or frame_it == frame_const_map_.begin()) + if (frame_it == frame_const_map_.end() or + std::distance(frame_const_map_.begin(), frame_it) < i) return nullptr; - return std::prev(frame_it)->second; + return std::prev(frame_it,i)->second; } -FrameBasePtr TrajectoryBase::getPreviousFrame(FrameBasePtr _frame) +FrameBasePtr TrajectoryBase::getPreviousFrame(FrameBasePtr _frame, const unsigned int& i) { auto frame_it = frame_map_.find(_frame->getTimeStamp()); WOLF_WARN_COND(frame_it == frame_map_.end(), "Frame not found in the frame map!"); - if (frame_it == frame_map_.end() or frame_it == frame_map_.begin()) + if (frame_it == frame_map_.end() or + std::distance(frame_map_.begin(), frame_it) < i) return nullptr; - return std::prev(frame_it)->second; + return std::prev(frame_it,i)->second; } diff --git a/src/tree_manager/tree_manager_sliding_window_dual_rate.cpp b/src/tree_manager/tree_manager_sliding_window_dual_rate.cpp index 61276bc7755ae02071fd9bfa219260c41029bda1..3b8800bfc4cd1de2803a9ac29b7cabf9b7a088e7 100644 --- a/src/tree_manager/tree_manager_sliding_window_dual_rate.cpp +++ b/src/tree_manager/tree_manager_sliding_window_dual_rate.cpp @@ -46,10 +46,8 @@ void TreeManagerSlidingWindowDualRate::keyFrameCallback(FrameBasePtr _frame) if (count_frames_ != 0) { WOLF_DEBUG("TreeManagerSlidingWindow removing the oldest of recent frames"); - FrameBasePtr remove_recent_frame = std::next(getProblem()->getTrajectory()->getFrameMap().rbegin(), - params_swdr_->n_frames_recent)->second; - FrameBasePtr keep_recent_frame = std::next(getProblem()->getTrajectory()->getFrameMap().rbegin(), - params_swdr_->n_frames_recent - 1)->second; + FrameBasePtr remove_recent_frame = getProblem()->getTrajectory()->getLastFrame()->getPreviousFrame(params_swdr_->n_frames_recent); + FrameBasePtr keep_recent_frame = remove_recent_frame->getNextFrame(); // compose motion captures for all processors motion for (auto motion_provider_pair : getProblem()->getMotionProviderMap()) diff --git a/test/gtest_frame_base.cpp b/test/gtest_frame_base.cpp index de1fc08ce7f926a380aeb04d21b33ec4dddde7b7..eb61f798d41b2aec792b864dffb39cb1cdb7d098 100644 --- a/test/gtest_frame_base.cpp +++ b/test/gtest_frame_base.cpp @@ -140,25 +140,15 @@ TEST(FrameBase, Frames) intrinsics_odo.k_rot_to_rot = 1; auto S = SensorBase::emplace<SensorOdom2d>(P->getHardware(), Vector3d::Zero(), intrinsics_odo); auto F0 = FrameBase::emplace<FrameBase>(T, 0, make_shared<StateBlock>(2), make_shared<StateBlock>(1)); - P->print(2,0,0,0); auto F1 = FrameBase::emplace<FrameBase>(T, 1, make_shared<StateBlock>(2), make_shared<StateBlock>(1)); - P->print(2,0,0,0); auto F2 = FrameBase::emplace<FrameBase>(T, 2, make_shared<StateBlock>(2), make_shared<StateBlock>(1)); - P->print(2,0,0,0); auto F3 = FrameBase::emplace<FrameBase>(T, 3, make_shared<StateBlock>(2), make_shared<StateBlock>(1)); - P->print(2,0,0,0); auto F4 = FrameBase::emplace<FrameBase>(T, 4, make_shared<StateBlock>(2), make_shared<StateBlock>(1)); - P->print(2,0,0,0); auto F5 = FrameBase::emplace<FrameBase>(T, 5, make_shared<StateBlock>(2), make_shared<StateBlock>(1)); - P->print(2,0,0,0); auto F6 = FrameBase::emplace<FrameBase>(T, 6, make_shared<StateBlock>(2), make_shared<StateBlock>(1)); - P->print(2,0,0,0); auto F7 = FrameBase::emplace<FrameBase>(T, 7, make_shared<StateBlock>(2), make_shared<StateBlock>(1)); - P->print(2,0,0,0); auto F8 = FrameBase::emplace<FrameBase>(T, 8, make_shared<StateBlock>(2), make_shared<StateBlock>(1)); - P->print(2,0,0,0); auto F9 = FrameBase::emplace<FrameBase>(T, 9, make_shared<StateBlock>(2), make_shared<StateBlock>(1)); - P->print(2,0,0,0); // tree is now consistent ASSERT_TRUE(P->check(0)); @@ -180,28 +170,226 @@ TEST(FrameBase, Frames) ASSERT_EQ(F9, T->closestFrameToTimeStamp(9)); // Next frame - EXPECT_EQ(F1->id(), F0->getNextFrame()->id()); - EXPECT_EQ(F2->id(), F1->getNextFrame()->id()); - EXPECT_EQ(F3->id(), F2->getNextFrame()->id()); - EXPECT_EQ(F4->id(), F3->getNextFrame()->id()); - EXPECT_EQ(F5->id(), F4->getNextFrame()->id()); - EXPECT_EQ(F6->id(), F5->getNextFrame()->id()); - EXPECT_EQ(F7->id(), F6->getNextFrame()->id()); - EXPECT_EQ(F8->id(), F7->getNextFrame()->id()); - EXPECT_EQ(F9->id(), F8->getNextFrame()->id()); - EXPECT_EQ(nullptr, F9->getNextFrame()); + EXPECT_EQ(F1, F0->getNextFrame(1)); + EXPECT_EQ(F2, F0->getNextFrame(2)); + EXPECT_EQ(F3, F0->getNextFrame(3)); + EXPECT_EQ(F4, F0->getNextFrame(4)); + EXPECT_EQ(F5, F0->getNextFrame(5)); + EXPECT_EQ(F6, F0->getNextFrame(6)); + EXPECT_EQ(F7, F0->getNextFrame(7)); + EXPECT_EQ(F8, F0->getNextFrame(8)); + EXPECT_EQ(F9, F0->getNextFrame(9)); + EXPECT_EQ(nullptr, F0->getNextFrame(10)); + + EXPECT_EQ(F2, F1->getNextFrame(1)); + EXPECT_EQ(F3, F1->getNextFrame(2)); + EXPECT_EQ(F4, F1->getNextFrame(3)); + EXPECT_EQ(F5, F1->getNextFrame(4)); + EXPECT_EQ(F6, F1->getNextFrame(5)); + EXPECT_EQ(F7, F1->getNextFrame(6)); + EXPECT_EQ(F8, F1->getNextFrame(7)); + EXPECT_EQ(F9, F1->getNextFrame(8)); + EXPECT_EQ(nullptr, F1->getNextFrame(9)); + EXPECT_EQ(nullptr, F1->getNextFrame(10)); + + EXPECT_EQ(F3, F2->getNextFrame(1)); + EXPECT_EQ(F4, F2->getNextFrame(2)); + EXPECT_EQ(F5, F2->getNextFrame(3)); + EXPECT_EQ(F6, F2->getNextFrame(4)); + EXPECT_EQ(F7, F2->getNextFrame(5)); + EXPECT_EQ(F8, F2->getNextFrame(6)); + EXPECT_EQ(F9, F2->getNextFrame(7)); + EXPECT_EQ(nullptr, F2->getNextFrame(8)); + EXPECT_EQ(nullptr, F2->getNextFrame(9)); + EXPECT_EQ(nullptr, F2->getNextFrame(10)); + + EXPECT_EQ(F4, F3->getNextFrame(1)); + EXPECT_EQ(F5, F3->getNextFrame(2)); + EXPECT_EQ(F6, F3->getNextFrame(3)); + EXPECT_EQ(F7, F3->getNextFrame(4)); + EXPECT_EQ(F8, F3->getNextFrame(5)); + EXPECT_EQ(F9, F3->getNextFrame(6)); + EXPECT_EQ(nullptr, F3->getNextFrame(7)); + EXPECT_EQ(nullptr, F3->getNextFrame(8)); + EXPECT_EQ(nullptr, F3->getNextFrame(9)); + EXPECT_EQ(nullptr, F3->getNextFrame(10)); + + EXPECT_EQ(F5, F4->getNextFrame(1)); + EXPECT_EQ(F6, F4->getNextFrame(2)); + EXPECT_EQ(F7, F4->getNextFrame(3)); + EXPECT_EQ(F8, F4->getNextFrame(4)); + EXPECT_EQ(F9, F4->getNextFrame(5)); + EXPECT_EQ(nullptr, F4->getNextFrame(6)); + EXPECT_EQ(nullptr, F4->getNextFrame(7)); + EXPECT_EQ(nullptr, F4->getNextFrame(8)); + EXPECT_EQ(nullptr, F4->getNextFrame(9)); + EXPECT_EQ(nullptr, F4->getNextFrame(10)); + + EXPECT_EQ(F6, F5->getNextFrame(1)); + EXPECT_EQ(F7, F5->getNextFrame(2)); + EXPECT_EQ(F8, F5->getNextFrame(3)); + EXPECT_EQ(F9, F5->getNextFrame(4)); + EXPECT_EQ(nullptr, F5->getNextFrame(5)); + EXPECT_EQ(nullptr, F5->getNextFrame(6)); + EXPECT_EQ(nullptr, F5->getNextFrame(7)); + EXPECT_EQ(nullptr, F5->getNextFrame(8)); + EXPECT_EQ(nullptr, F5->getNextFrame(9)); + EXPECT_EQ(nullptr, F5->getNextFrame(10)); + + EXPECT_EQ(F7, F6->getNextFrame(1)); + EXPECT_EQ(F8, F6->getNextFrame(2)); + EXPECT_EQ(F9, F6->getNextFrame(3)); + EXPECT_EQ(nullptr, F6->getNextFrame(4)); + EXPECT_EQ(nullptr, F6->getNextFrame(5)); + EXPECT_EQ(nullptr, F6->getNextFrame(6)); + EXPECT_EQ(nullptr, F6->getNextFrame(7)); + EXPECT_EQ(nullptr, F6->getNextFrame(8)); + EXPECT_EQ(nullptr, F6->getNextFrame(9)); + EXPECT_EQ(nullptr, F6->getNextFrame(10)); + + EXPECT_EQ(F8, F7->getNextFrame(1)); + EXPECT_EQ(F9, F7->getNextFrame(2)); + EXPECT_EQ(nullptr, F7->getNextFrame(3)); + EXPECT_EQ(nullptr, F7->getNextFrame(4)); + EXPECT_EQ(nullptr, F7->getNextFrame(5)); + EXPECT_EQ(nullptr, F7->getNextFrame(6)); + EXPECT_EQ(nullptr, F7->getNextFrame(7)); + EXPECT_EQ(nullptr, F7->getNextFrame(8)); + EXPECT_EQ(nullptr, F7->getNextFrame(9)); + EXPECT_EQ(nullptr, F7->getNextFrame(10)); + + EXPECT_EQ(F9, F8->getNextFrame(1)); + EXPECT_EQ(nullptr, F8->getNextFrame(2)); + EXPECT_EQ(nullptr, F8->getNextFrame(3)); + EXPECT_EQ(nullptr, F8->getNextFrame(4)); + EXPECT_EQ(nullptr, F8->getNextFrame(5)); + EXPECT_EQ(nullptr, F8->getNextFrame(6)); + EXPECT_EQ(nullptr, F8->getNextFrame(7)); + EXPECT_EQ(nullptr, F8->getNextFrame(8)); + EXPECT_EQ(nullptr, F8->getNextFrame(9)); + EXPECT_EQ(nullptr, F8->getNextFrame(10)); + + EXPECT_EQ(nullptr, F9->getNextFrame(1)); + EXPECT_EQ(nullptr, F9->getNextFrame(2)); + EXPECT_EQ(nullptr, F9->getNextFrame(3)); + EXPECT_EQ(nullptr, F9->getNextFrame(4)); + EXPECT_EQ(nullptr, F9->getNextFrame(5)); + EXPECT_EQ(nullptr, F9->getNextFrame(6)); + EXPECT_EQ(nullptr, F9->getNextFrame(7)); + EXPECT_EQ(nullptr, F9->getNextFrame(8)); + EXPECT_EQ(nullptr, F9->getNextFrame(9)); + EXPECT_EQ(nullptr, F9->getNextFrame(10)); // Prev frame - EXPECT_EQ(nullptr, F0->getPreviousFrame()); - EXPECT_EQ(F0, F1->getPreviousFrame()); - EXPECT_EQ(F1, F2->getPreviousFrame()); - EXPECT_EQ(F2, F3->getPreviousFrame()); - EXPECT_EQ(F3, F4->getPreviousFrame()); - EXPECT_EQ(F4, F5->getPreviousFrame()); - EXPECT_EQ(F5, F6->getPreviousFrame()); - EXPECT_EQ(F6, F7->getPreviousFrame()); - EXPECT_EQ(F7, F8->getPreviousFrame()); - EXPECT_EQ(F8, F9->getPreviousFrame()); + EXPECT_EQ(F8, F9->getPreviousFrame(1)); + EXPECT_EQ(F7, F9->getPreviousFrame(2)); + EXPECT_EQ(F6, F9->getPreviousFrame(3)); + EXPECT_EQ(F5, F9->getPreviousFrame(4)); + EXPECT_EQ(F4, F9->getPreviousFrame(5)); + EXPECT_EQ(F3, F9->getPreviousFrame(6)); + EXPECT_EQ(F2, F9->getPreviousFrame(7)); + EXPECT_EQ(F1, F9->getPreviousFrame(8)); + EXPECT_EQ(F0, F9->getPreviousFrame(9)); + EXPECT_EQ(nullptr, F9->getPreviousFrame(10)); + + EXPECT_EQ(F7, F8->getPreviousFrame(1)); + EXPECT_EQ(F6, F8->getPreviousFrame(2)); + EXPECT_EQ(F5, F8->getPreviousFrame(3)); + EXPECT_EQ(F4, F8->getPreviousFrame(4)); + EXPECT_EQ(F3, F8->getPreviousFrame(5)); + EXPECT_EQ(F2, F8->getPreviousFrame(6)); + EXPECT_EQ(F1, F8->getPreviousFrame(7)); + EXPECT_EQ(F0, F8->getPreviousFrame(8)); + EXPECT_EQ(nullptr, F8->getPreviousFrame(9)); + EXPECT_EQ(nullptr, F8->getPreviousFrame(10)); + + EXPECT_EQ(F6, F7->getPreviousFrame(1)); + EXPECT_EQ(F5, F7->getPreviousFrame(2)); + EXPECT_EQ(F4, F7->getPreviousFrame(3)); + EXPECT_EQ(F3, F7->getPreviousFrame(4)); + EXPECT_EQ(F2, F7->getPreviousFrame(5)); + EXPECT_EQ(F1, F7->getPreviousFrame(6)); + EXPECT_EQ(F0, F7->getPreviousFrame(7)); + EXPECT_EQ(nullptr, F7->getPreviousFrame(8)); + EXPECT_EQ(nullptr, F7->getPreviousFrame(9)); + EXPECT_EQ(nullptr, F7->getPreviousFrame(10)); + + EXPECT_EQ(F5, F6->getPreviousFrame(1)); + EXPECT_EQ(F4, F6->getPreviousFrame(2)); + EXPECT_EQ(F3, F6->getPreviousFrame(3)); + EXPECT_EQ(F2, F6->getPreviousFrame(4)); + EXPECT_EQ(F1, F6->getPreviousFrame(5)); + EXPECT_EQ(F0, F6->getPreviousFrame(6)); + EXPECT_EQ(nullptr, F6->getPreviousFrame(7)); + EXPECT_EQ(nullptr, F6->getPreviousFrame(8)); + EXPECT_EQ(nullptr, F6->getPreviousFrame(9)); + EXPECT_EQ(nullptr, F6->getPreviousFrame(10)); + + EXPECT_EQ(F4, F5->getPreviousFrame(1)); + EXPECT_EQ(F3, F5->getPreviousFrame(2)); + EXPECT_EQ(F2, F5->getPreviousFrame(3)); + EXPECT_EQ(F1, F5->getPreviousFrame(4)); + EXPECT_EQ(F0, F5->getPreviousFrame(5)); + EXPECT_EQ(nullptr, F5->getPreviousFrame(6)); + EXPECT_EQ(nullptr, F5->getPreviousFrame(7)); + EXPECT_EQ(nullptr, F5->getPreviousFrame(8)); + EXPECT_EQ(nullptr, F5->getPreviousFrame(9)); + EXPECT_EQ(nullptr, F5->getPreviousFrame(10)); + + EXPECT_EQ(F3, F4->getPreviousFrame(1)); + EXPECT_EQ(F2, F4->getPreviousFrame(2)); + EXPECT_EQ(F1, F4->getPreviousFrame(3)); + EXPECT_EQ(F0, F4->getPreviousFrame(4)); + EXPECT_EQ(nullptr, F4->getPreviousFrame(5)); + EXPECT_EQ(nullptr, F4->getPreviousFrame(6)); + EXPECT_EQ(nullptr, F4->getPreviousFrame(7)); + EXPECT_EQ(nullptr, F4->getPreviousFrame(8)); + EXPECT_EQ(nullptr, F4->getPreviousFrame(9)); + EXPECT_EQ(nullptr, F4->getPreviousFrame(10)); + + EXPECT_EQ(F2, F3->getPreviousFrame(1)); + EXPECT_EQ(F1, F3->getPreviousFrame(2)); + EXPECT_EQ(F0, F3->getPreviousFrame(3)); + EXPECT_EQ(nullptr, F3->getPreviousFrame(4)); + EXPECT_EQ(nullptr, F3->getPreviousFrame(5)); + EXPECT_EQ(nullptr, F3->getPreviousFrame(6)); + EXPECT_EQ(nullptr, F3->getPreviousFrame(7)); + EXPECT_EQ(nullptr, F3->getPreviousFrame(8)); + EXPECT_EQ(nullptr, F3->getPreviousFrame(9)); + EXPECT_EQ(nullptr, F3->getPreviousFrame(10)); + + EXPECT_EQ(F1, F2->getPreviousFrame(1)); + EXPECT_EQ(F0, F2->getPreviousFrame(2)); + EXPECT_EQ(nullptr, F2->getPreviousFrame(3)); + EXPECT_EQ(nullptr, F2->getPreviousFrame(4)); + EXPECT_EQ(nullptr, F2->getPreviousFrame(5)); + EXPECT_EQ(nullptr, F2->getPreviousFrame(6)); + EXPECT_EQ(nullptr, F2->getPreviousFrame(7)); + EXPECT_EQ(nullptr, F2->getPreviousFrame(8)); + EXPECT_EQ(nullptr, F2->getPreviousFrame(9)); + EXPECT_EQ(nullptr, F2->getPreviousFrame(10)); + + EXPECT_EQ(F0, F1->getPreviousFrame(1)); + EXPECT_EQ(nullptr, F1->getPreviousFrame(2)); + EXPECT_EQ(nullptr, F1->getPreviousFrame(3)); + EXPECT_EQ(nullptr, F1->getPreviousFrame(4)); + EXPECT_EQ(nullptr, F1->getPreviousFrame(5)); + EXPECT_EQ(nullptr, F1->getPreviousFrame(6)); + EXPECT_EQ(nullptr, F1->getPreviousFrame(7)); + EXPECT_EQ(nullptr, F1->getPreviousFrame(8)); + EXPECT_EQ(nullptr, F1->getPreviousFrame(9)); + EXPECT_EQ(nullptr, F1->getPreviousFrame(10)); + + EXPECT_EQ(nullptr, F0->getPreviousFrame(1)); + EXPECT_EQ(nullptr, F0->getPreviousFrame(2)); + EXPECT_EQ(nullptr, F0->getPreviousFrame(3)); + EXPECT_EQ(nullptr, F0->getPreviousFrame(4)); + EXPECT_EQ(nullptr, F0->getPreviousFrame(5)); + EXPECT_EQ(nullptr, F0->getPreviousFrame(6)); + EXPECT_EQ(nullptr, F0->getPreviousFrame(7)); + EXPECT_EQ(nullptr, F0->getPreviousFrame(8)); + EXPECT_EQ(nullptr, F0->getPreviousFrame(9)); + EXPECT_EQ(nullptr, F0->getPreviousFrame(10)); } #include "core/state_block/state_quaternion.h"