Parasol Planning Library (PPL)
Chain.h
Go to the documentation of this file.
1 #ifndef PMPL_CHAIN_H_
2 #define PMPL_CHAIN_H_
3 
4 #include <deque>
5 #include <iostream>
6 #include <utility>
7 #include <vector>
8 
9 class Connection;
10 class Body;
11 class MultiBody;
12 
13 
29 class Chain final {
30 
31  public:
32 
35 
36  typedef std::deque<const Connection*> JointList;
37  typedef JointList::const_iterator iterator;
38 
43 
48  static std::vector<Chain> Decompose(const MultiBody* const _mb);
49 
53  std::pair<Chain, Chain> Bisect() const noexcept;
54 
60 
62  Chain& Reverse() noexcept;
63 
68  Chain& Append(const Chain& _other) noexcept;
69 
74 
75  iterator begin() const noexcept;
76  iterator end() const noexcept;
77 
81 
84  const Body* GetFrontBody() const noexcept;
85 
88  const Body* GetBackBody() const noexcept;
89 
91  const Connection* GetFirstJoint() const noexcept;
92 
94  const Connection* GetLastJoint() const noexcept;
95 
97  bool IsForward() const noexcept;
98 
100  size_t GetNumJoints() const noexcept;
101 
103  size_t Size() const noexcept;
104 
106  bool IsSingleLink() const noexcept;
107 
109 
110  private:
111 
115 
124  Chain(const MultiBody* const _mb, JointList&& _joints,
125  const Body* const _front, const Body* const _back, const bool _forward);
126 
130 
131  const MultiBody* const m_multibody;
132 
133  JointList m_joints;
134  const Body* m_frontBody{nullptr};
135  const Body* m_backBody{nullptr};
136  bool m_forward{true};
137 
139 
140 };
141 
142 
144 std::ostream& operator<<(std::ostream&, const Chain&);
145 
146 #endif
std::ostream & operator<<(std::ostream &, const Chain &)
Output operator for debugging chains.
Definition: Chain.cpp:298
Definition: Body.h:41
Definition: Chain.h:29
const Body * GetBackBody() const noexcept
Definition: Chain.cpp:274
const Body * GetFrontBody() const noexcept
Definition: Chain.cpp:267
iterator begin() const noexcept
Definition: Chain.cpp:217
size_t Size() const noexcept
Get the number of objects in the chain (joints and bodies).
Definition: Chain.cpp:260
const Connection * GetFirstJoint() const noexcept
Get the first joint.
Definition: Chain.cpp:232
bool IsSingleLink() const noexcept
Check if the current chain has only one link.
Definition: Chain.cpp:209
static std::vector< Chain > Decompose(const MultiBody *const _mb)
Definition: Chain.cpp:18
Chain & Append(const Chain &_other) noexcept
Definition: Chain.cpp:180
std::pair< Chain, Chain > Bisect() const noexcept
Definition: Chain.cpp:132
Chain & Reverse() noexcept
Reverse the traversal order of this chain.
Definition: Chain.cpp:169
size_t GetNumJoints() const noexcept
Get the number of joints in the chain.
Definition: Chain.cpp:253
const Connection * GetLastJoint() const noexcept
Get the last joint.
Definition: Chain.cpp:239
JointList::const_iterator iterator
Definition: Chain.h:37
std::deque< const Connection * > JointList
Definition: Chain.h:36
iterator end() const noexcept
Definition: Chain.cpp:224
bool IsForward() const noexcept
Is this chain oriented in the same way as the multibody?
Definition: Chain.cpp:246
Definition: Connection.h:35
Definition: MultiBody.h:65