pimpl_func() only in SubTask class

This commit is contained in:
Robert Haschke 2017-10-03 22:17:41 +02:00
parent 11b6dd2efd
commit ce7d570459
6 changed files with 11 additions and 24 deletions

View File

@ -9,9 +9,7 @@
#include <list>
#define PRIVATE_CLASS(Class) \
friend class Class##Private; \
Class##Private* pimpl_func(); \
const Class##Private* pimpl_func() const;
friend class Class##Private;
namespace planning_scene {
MOVEIT_CLASS_FORWARD(PlanningScene)

View File

@ -31,12 +31,13 @@ bool ContainerBasePrivate::traverseStages(const ContainerBase::StageCallback &pr
continue;
ContainerBase *container = dynamic_cast<ContainerBase*>(stage.get());
if (container)
container->pimpl_func()->traverseStages(processor, depth+1);
static_cast<ContainerBasePrivate*>(container->pimpl_func())->traverseStages(processor, depth+1);
}
return true;
}
ContainerBasePrivate::iterator ContainerBasePrivate::insert(ContainerBasePrivate::value_type &&subtask, ContainerBasePrivate::const_iterator pos) {
ContainerBasePrivate::iterator ContainerBasePrivate::insert(ContainerBasePrivate::value_type &&subtask,
ContainerBasePrivate::const_iterator pos) {
SubTaskPrivate *impl = subtask->pimpl_func();
impl->parent_ = this;
subtask->setPlanningScene(scene_);
@ -46,7 +47,6 @@ ContainerBasePrivate::iterator ContainerBasePrivate::insert(ContainerBasePrivate
}
PRIVATE_CLASS_IMPL(ContainerBase)
ContainerBase::ContainerBase(ContainerBasePrivate *impl)
: SubTask(impl)
{
@ -86,7 +86,6 @@ const SubTaskPrivate *SerialContainerPrivate::next_(const SubTaskPrivate *child)
}
PRIVATE_CLASS_IMPL(SerialContainer)
SerialContainer::SerialContainer(SerialContainerPrivate *impl)
: ContainerBase(impl)
{}

View File

@ -101,7 +101,6 @@ const SubTaskPrivate* SubTaskPrivate::next() const {
}
PRIVATE_CLASS_IMPL(PropagatingAnyWay)
PropagatingAnyWay::PropagatingAnyWay(const std::string &name)
: SubTask(new PropagatingAnyWayPrivate(this, name))
{}
@ -179,19 +178,16 @@ void PropagatingAnyWay::newOutputState(const Interface::iterator &it)
}
PRIVATE_CLASS_IMPL(PropagatingForward)
PropagatingForward::PropagatingForward(const std::string& name)
: PropagatingAnyWay(new PropagatingForwardPrivate(this, name))
{}
PRIVATE_CLASS_IMPL(PropagatingBackward)
PropagatingBackward::PropagatingBackward(const std::string &name)
: PropagatingAnyWay(new PropagatingBackwardPrivate(this, name))
{}
PRIVATE_CLASS_IMPL(Generator)
Generator::Generator(const std::string &name)
: SubTask(new GeneratorPrivate(this, name))
{}
@ -209,7 +205,6 @@ void Generator::spawn(const planning_scene::PlanningSceneConstPtr& ps, double co
}
PRIVATE_CLASS_IMPL(Connecting)
Connecting::Connecting(const std::string &name)
: SubTask(new ConnectingPrivate(this, name))
{

View File

@ -143,10 +143,5 @@ private:
} }
// implement pimpl_func()
#define PRIVATE_CLASS_IMPL(Class) \
inline Class##Private* Class::pimpl_func() { return static_cast<Class##Private*>(pimpl_); } \
inline const Class##Private* Class::pimpl_func() const { return static_cast<const Class##Private*>(pimpl_); } \
// get correctly casted private impl pointer
#define IMPL(Class) Class##Private * const impl = pimpl_func()
#define IMPL(Class) Class##Private * const impl = static_cast<Class##Private*>(pimpl_func());

View File

@ -68,7 +68,6 @@ public:
};
PRIVATE_CLASS_IMPL(Task)
Task::Task(const std::string &name)
: SerialContainer(new TaskPrivate(this, name))
{
@ -135,7 +134,8 @@ bool traverseFullTrajectories(
}
bool Task::processSolutions(const Task::SolutionCallback& processor) {
const TaskPrivate::array_type& children = pimpl_func()->children();
IMPL(Task);
const TaskPrivate::array_type& children = impl->children();
const size_t nr_of_trajectories = children.size();
std::vector<SubTrajectory*> trace;
trace.reserve(nr_of_trajectories);

View File

@ -90,7 +90,7 @@ TEST_F(SubTaskTest, interfaceFlags) {
TEST_F(SubTaskTest, serialContainer) {
SerialContainer c("serial");
SerialContainerPrivate *cp = c.pimpl_func();
SerialContainerPrivate *cp = static_cast<SerialContainerPrivate*>(c.pimpl_func());
EXPECT_TRUE(bool(cp->input_));
EXPECT_TRUE(bool(cp->output_));
@ -100,7 +100,7 @@ TEST_F(SubTaskTest, serialContainer) {
/***** inserting first stage *****/
auto g = std::make_unique<TestGenerator>();
GeneratorPrivate *gp = g->pimpl_func();
GeneratorPrivate *gp = static_cast<GeneratorPrivate*>(g->pimpl_func());
ASSERT_TRUE(c.insert(std::move(g)));
EXPECT_FALSE(g); // ownership transferred to container
VALIDATE(gp);
@ -114,14 +114,14 @@ TEST_F(SubTaskTest, serialContainer) {
/***** inserting second stage *****/
auto f = std::make_unique<TestPropagatingForward>();
PropagatingForwardPrivate *fp = f->pimpl_func();
PropagatingForwardPrivate *fp = static_cast<PropagatingForwardPrivate*>(f->pimpl_func());
ASSERT_TRUE(c.insert(std::move(f)));
EXPECT_FALSE(f); // ownership transferred to container
VALIDATE(gp, fp);
/***** inserting third stage *****/
auto f2 = std::make_unique<TestPropagatingForward>();
PropagatingForwardPrivate *fp2 = f2->pimpl_func();
PropagatingForwardPrivate *fp2 = static_cast<PropagatingForwardPrivate*>(f2->pimpl_func());
#if 0
EXPECT_FALSE(c.insert(std::move(f2), 0)); // should fail at first position
EXPECT_TRUE(bool(f)); // ownership not transferred to container