mirror of
https://github.com/moveit/moveit_task_constructor.git
synced 2025-11-04 14:49:57 +08:00
Expose ContainerBase::childByIndex via operator[](int) (#413)
This commit is contained in:
parent
26c690c3b6
commit
f872d58520
@ -53,6 +53,7 @@ public:
|
|||||||
|
|
||||||
size_t numChildren() const;
|
size_t numChildren() const;
|
||||||
Stage* findChild(const std::string& name) const;
|
Stage* findChild(const std::string& name) const;
|
||||||
|
Stage* operator[](int index) const;
|
||||||
|
|
||||||
/** Callback function type used by traverse functions
|
/** Callback function type used by traverse functions
|
||||||
* Receives currently visited Stage and current depth in hierarchy
|
* Receives currently visited Stage and current depth in hierarchy
|
||||||
|
|||||||
@ -74,6 +74,7 @@ class Task : protected WrapperBase
|
|||||||
public:
|
public:
|
||||||
PRIVATE_CLASS(Task)
|
PRIVATE_CLASS(Task)
|
||||||
using WrapperBase::setCostTerm;
|
using WrapperBase::setCostTerm;
|
||||||
|
using WrapperBase::operator[];
|
||||||
|
|
||||||
Task(const std::string& ns = "", bool introspection = true,
|
Task(const std::string& ns = "", bool introspection = true,
|
||||||
ContainerBase::pointer&& container = std::make_unique<SerialContainer>("task pipeline"));
|
ContainerBase::pointer&& container = std::make_unique<SerialContainer>("task pipeline"));
|
||||||
|
|||||||
@ -356,6 +356,15 @@ void export_core(pybind11::module& m) {
|
|||||||
return child;
|
return child;
|
||||||
},
|
},
|
||||||
py::return_value_policy::reference_internal)
|
py::return_value_policy::reference_internal)
|
||||||
|
.def(
|
||||||
|
"__getitem__",
|
||||||
|
[](const ContainerBase& c, int idx) -> Stage* {
|
||||||
|
Stage* child = c[idx];
|
||||||
|
if (!child)
|
||||||
|
throw py::index_error();
|
||||||
|
return child;
|
||||||
|
},
|
||||||
|
py::return_value_policy::reference_internal)
|
||||||
.def(
|
.def(
|
||||||
"__iter__",
|
"__iter__",
|
||||||
[](const ContainerBase& c) {
|
[](const ContainerBase& c) {
|
||||||
@ -441,6 +450,15 @@ void export_core(pybind11::module& m) {
|
|||||||
return child;
|
return child;
|
||||||
},
|
},
|
||||||
py::return_value_policy::reference_internal)
|
py::return_value_policy::reference_internal)
|
||||||
|
.def(
|
||||||
|
"__getitem__",
|
||||||
|
[](const Task& t, int idx) -> Stage* {
|
||||||
|
Stage* child = t.stages()->operator[](idx);
|
||||||
|
if (!child)
|
||||||
|
throw py::index_error();
|
||||||
|
return child;
|
||||||
|
},
|
||||||
|
py::return_value_policy::reference_internal)
|
||||||
.def(
|
.def(
|
||||||
"__iter__",
|
"__iter__",
|
||||||
[](const Task& t) {
|
[](const Task& t) {
|
||||||
|
|||||||
@ -279,38 +279,52 @@ class TestStages(unittest.TestCase):
|
|||||||
stage.setCostTerm(costs)
|
stage.setCostTerm(costs)
|
||||||
|
|
||||||
|
|
||||||
class TestContainer(unittest.TestCase):
|
class BaseTestCases:
|
||||||
|
class ContainerTest(unittest.TestCase):
|
||||||
|
def __init__(self, ContainerType, *args, **kwargs):
|
||||||
|
super(BaseTestCases.ContainerTest, self).__init__(*args, **kwargs)
|
||||||
|
self.ContainerType = ContainerType
|
||||||
|
self.container = container = ContainerType()
|
||||||
|
container.add(stages.CurrentState("1"))
|
||||||
|
container.add(stages.CurrentState("2"))
|
||||||
|
container.add(stages.CurrentState("3"))
|
||||||
|
|
||||||
|
def test_move(self):
|
||||||
|
container = self.ContainerType()
|
||||||
|
stage = stages.CurrentState()
|
||||||
|
container.add(stage)
|
||||||
|
with self.assertRaises(ValueError):
|
||||||
|
stage.name
|
||||||
|
|
||||||
|
def test_access_by_name(self):
|
||||||
|
with self.assertRaises(IndexError):
|
||||||
|
self.container["unknown"]
|
||||||
|
|
||||||
|
child = self.container["2"]
|
||||||
|
self.assertEqual(child.name, "2")
|
||||||
|
|
||||||
|
def test_access_by_iterator(self):
|
||||||
|
self.assertEqual([child.name for child in self.container], ["1", "2", "3"])
|
||||||
|
|
||||||
|
def test_access_by_index(self):
|
||||||
|
self.assertEqual(self.container[0].name, "1")
|
||||||
|
self.assertEqual(self.container[1].name, "2")
|
||||||
|
self.assertEqual(self.container[-1].name, "3")
|
||||||
|
self.assertEqual(self.container[-2].name, "2")
|
||||||
|
with self.assertRaises(IndexError):
|
||||||
|
self.container[3]
|
||||||
|
with self.assertRaises(IndexError):
|
||||||
|
self.container[-4]
|
||||||
|
|
||||||
|
|
||||||
|
class TestSerial(BaseTestCases.ContainerTest):
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
super(TestContainer, self).__init__(*args, **kwargs)
|
super(TestSerial, self).__init__(core.SerialContainer, *args, **kwargs)
|
||||||
|
|
||||||
def test_move(self):
|
|
||||||
container = core.SerialContainer()
|
|
||||||
stage = stages.CurrentState()
|
|
||||||
container.add(stage)
|
|
||||||
with self.assertRaises(ValueError):
|
|
||||||
stage.name
|
|
||||||
|
|
||||||
def check(self, container):
|
|
||||||
container = core.SerialContainer()
|
|
||||||
container.add(stages.CurrentState("1"))
|
|
||||||
container.add(stages.CurrentState("2"))
|
|
||||||
container.add(stages.CurrentState("3"))
|
|
||||||
with self.assertRaises(IndexError):
|
|
||||||
container["unknown"]
|
|
||||||
child = container["2"]
|
|
||||||
self.assertEqual(child.name, "2")
|
|
||||||
self.assertEqual([child.name for child in container], ["1", "2", "3"])
|
|
||||||
|
|
||||||
def test_serial(self):
|
|
||||||
self.check(core.SerialContainer())
|
|
||||||
|
|
||||||
def test_task(self):
|
|
||||||
self.check(core.Task())
|
|
||||||
|
|
||||||
|
|
||||||
class TestTask(unittest.TestCase):
|
class TestTask(BaseTestCases.ContainerTest):
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
super(TestTask, self).__init__(*args, **kwargs)
|
super(TestTask, self).__init__(core.Task, *args, **kwargs)
|
||||||
|
|
||||||
def test(self):
|
def test(self):
|
||||||
task = core.Task()
|
task = core.Task()
|
||||||
|
|||||||
@ -341,6 +341,12 @@ Stage* ContainerBase::findChild(const std::string& name) const {
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Stage* ContainerBase::operator[](int index) const {
|
||||||
|
auto impl = pimpl();
|
||||||
|
auto it = impl->childByIndex(index, false);
|
||||||
|
return it != impl->children().end() ? it->get() : nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
bool ContainerBase::traverseChildren(const ContainerBase::StageCallback& processor) const {
|
bool ContainerBase::traverseChildren(const ContainerBase::StageCallback& processor) const {
|
||||||
return pimpl()->traverseStages(processor, 0, 1);
|
return pimpl()->traverseStages(processor, 0, 1);
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user