DART 6.13.2
Loading...
Searching...
No Matches
MetaSkeleton-impl.hpp
Go to the documentation of this file.
1/*
2 * Copyright (c) 2011-2022, The DART development contributors
3 * All rights reserved.
4 *
5 * The list of contributors can be found at:
6 * https://github.com/dartsim/dart/blob/master/LICENSE
7 *
8 * This file is provided under the following "BSD-style" License:
9 * Redistribution and use in source and binary forms, with or
10 * without modification, are permitted provided that the following
11 * conditions are met:
12 * * Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
14 * * Redistributions in binary form must reproduce the above
15 * copyright notice, this list of conditions and the following
16 * disclaimer in the documentation and/or other materials provided
17 * with the distribution.
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
19 * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
20 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
21 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
23 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
26 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
27 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
29 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30 * POSSIBILITY OF SUCH DAMAGE.
31 */
32
33#ifndef DART_DYNAMICS_DETAIL_METASKELETON_IMPL_HPP_
34#define DART_DYNAMICS_DETAIL_METASKELETON_IMPL_HPP_
35
37
38namespace dart::dynamics {
39
40//==============================================================================
41template <typename Func>
42void MetaSkeleton::eachBodyNode(Func func) const
43{
44 if constexpr (std::is_same_v<
45 std::invoke_result_t<Func, const dynamics::BodyNode*>,
46 bool>)
47 {
48 for (auto i = 0u; i < getNumBodyNodes(); ++i)
49 {
50 if (!func(getBodyNode(i)))
51 return;
52 }
53 }
54 else
55 {
56 for (auto i = 0u; i < getNumBodyNodes(); ++i)
57 {
58 func(getBodyNode(i));
59 }
60 }
61}
62
63//==============================================================================
64template <typename Func>
66{
67 if constexpr (std::is_same_v<
68 std::invoke_result_t<Func, dynamics::BodyNode*>,
69 bool>)
70 {
71 for (auto i = 0u; i < getNumBodyNodes(); ++i)
72 {
73 if (!func(getBodyNode(i)))
74 return;
75 }
76 }
77 else
78 {
79 for (auto i = 0u; i < getNumBodyNodes(); ++i)
80 {
81 func(getBodyNode(i));
82 }
83 }
84}
85
86//==============================================================================
87template <typename Func>
88void MetaSkeleton::eachJoint(Func func) const
89{
90 if constexpr (std::is_same_v<
91 std::invoke_result_t<Func, const dynamics::Joint*>,
92 bool>)
93 {
94 for (auto i = 0u; i < getNumJoints(); ++i)
95 {
96 if (!func(getJoint(i)))
97 return;
98 }
99 }
100 else
101 {
102 for (auto i = 0u; i < getNumJoints(); ++i)
103 {
104 func(getJoint(i));
105 }
106 }
107}
108
109//==============================================================================
110template <typename Func>
112{
113 if constexpr (std::is_same_v<
114 std::invoke_result_t<Func, dynamics::Joint*>,
115 bool>)
116 {
117 for (auto i = 0u; i < getNumJoints(); ++i)
118 {
119 if (!func(getJoint(i)))
120 return;
121 }
122 }
123 else
124 {
125 for (auto i = 0u; i < getNumJoints(); ++i)
126 {
127 func(getJoint(i));
128 }
129 }
130}
131
132//==============================================================================
133template <typename Func>
134void MetaSkeleton::eachDof(Func func) const
135{
136 if constexpr (std::is_same_v<
137 std::
138 invoke_result_t<Func, const dynamics::DegreeOfFreedom*>,
139 bool>)
140 {
141 for (auto i = 0u; i < getNumDofs(); ++i)
142 {
143 if (!func(getDof(i)))
144 return;
145 }
146 }
147 else
148 {
149 for (auto i = 0u; i < getNumDofs(); ++i)
150 {
151 func(getDof(i));
152 }
153 }
154}
155
156//==============================================================================
157template <typename Func>
159{
160 if constexpr (std::is_same_v<
161 std::invoke_result_t<Func, dynamics::DegreeOfFreedom*>,
162 bool>)
163 {
164 for (auto i = 0u; i < getNumDofs(); ++i)
165 {
166 if (!func(getDof(i)))
167 return;
168 }
169 }
170 else
171 {
172 for (auto i = 0u; i < getNumDofs(); ++i)
173 {
174 func(getDof(i));
175 }
176 }
177}
178
179} // namespace dart::dynamics
180
181#endif // DART_DYNAMICS_DETAIL_METASKELETON_IMPL_HPP_
virtual BodyNode * getBodyNode(std::size_t _idx)=0
Get BodyNode whose index is _idx.
void eachJoint(Func func) const
Iterates all the Joints in this MetaSkeleton and invokes the callback function.
Definition MetaSkeleton-impl.hpp:88
virtual std::size_t getNumJoints() const =0
Get number of Joints.
virtual Joint * getJoint(std::size_t _idx)=0
Get Joint whose index is _idx.
void eachBodyNode(Func func) const
Iterates all the BodyNodes in this MetaSkeleton and invokes the callback function.
Definition MetaSkeleton-impl.hpp:42
void eachDof(Func func) const
Iterates all the DegreeOfFreedoms in this MetaSkeleton and invokes the callback function.
Definition MetaSkeleton-impl.hpp:134
virtual std::size_t getNumBodyNodes() const =0
Get number of body nodes.
virtual DegreeOfFreedom * getDof(std::size_t _idx)=0
Get degree of freedom (aka generalized coordinate) whose index is _idx.
virtual std::size_t getNumDofs() const =0
Return the number of degrees of freedom in this skeleton.
Definition CollisionFilter.hpp:41