29#include "trax/ObjectID.h"
30#include "trax/Units.h"
36#include "spat/Frame.h"
41 class Pose_Imp :
public Base{
45 m_AbsoluteFrame.Init();
51 PropagateAbsoluteFrameToClients();
59# pragma GCC diagnostic push
60# pragma GCC diagnostic ignored "-Winconsistent-missing-override"
66 m_AbsoluteFrame = frame;
67 PropagateAbsoluteFrameToClients();
73 return m_AbsoluteFrame;
76# pragma GCC diagnostic pop
81 m_AbsoluteFrame = absolutFrame;
82 PropagateAbsoluteFrameToClients();
87 virtual void PropagateAbsoluteFrameToClients()
noexcept{}
94 template<
class TraxType,
class Base>
95 class Container_Imp :
public Base{
97 Container_Imp()
noexcept;
103 using Base::IsMember;
105 bool IsValid ()
const noexcept override;
107 IDType Add ( std::shared_ptr<TraxType> pTraxType )
override;
109 IDType AddRelaxed ( std::shared_ptr<TraxType> pTraxType )
override;
111 bool Remove ( TraxType* pTraxType,
bool zeroIDs =
false )
override;
113 int Take (
typename Base::collection_type& collection )
override;
115 void Clear ()
noexcept override;
117 int Count ()
const noexcept override;
119 typename Base::collection_type::iterator begin ()
noexcept override;
121 typename Base::collection_type::iterator end ()
noexcept override;
123 typename Base::collection_type::const_iterator begin()
const noexcept override;
125 typename Base::collection_type::const_iterator cbegin()
const noexcept override;
127 typename Base::collection_type::const_iterator end()
const noexcept override;
129 typename Base::collection_type::const_iterator cend()
const noexcept override;
131 std::shared_ptr<TraxType> GetFirst ()
const noexcept override;
133 std::shared_ptr<TraxType> GetNext (
const std::shared_ptr<TraxType>& pTraxType )
const override;
135 std::shared_ptr<TraxType> GetLast ()
const override;
137 std::shared_ptr<TraxType> GetPrevious (
const std::shared_ptr<TraxType>& pTraxType )
const override;
139 std::shared_ptr<TraxType> Get (
IDType id )
const override;
141 std::shared_ptr<TraxType> Get (
const std::string& name )
const override;
143 void PushActive (
IDType id )
override;
145 void PopActive ()
override;
147 std::shared_ptr<TraxType> GetActive ()
const override;
149 bool IsMember (
const TraxType& item )
const override;
151 bool IsMember (
IDType id )
const override;
153 void ShiftIDs (
int offset )
override;
155 IDType MaxID ()
const override;
157 IDType MinID ()
const override;
161 void SetDecorator( Base* pDecorator )
noexcept override;
162 Base* Decorator()
const noexcept{
return m_pDecorator; }
164 using ContainerType = std::map<IDType,std::shared_ptr<TraxType>>;
165 ContainerType m_Container;
169 bool IsFree(
IDType id )
const{
170 return m_Container.find(
id ) == m_Container.end();
173 std::stack<IDType> m_ActiveStack;
177 for(
auto citer = m_Container.begin();
178 citer != m_Container.end(); ++x, ++citer )
180 if( x == (*citer).first )
193template<
class TraxType,
class Base>
194inline Container_Imp<TraxType, Base>::Container_Imp() noexcept
197 SetDecorator(
this );
200template<
class TraxType,
class Base>
201inline bool Container_Imp<TraxType, Base>::IsValid() const noexcept
206template<
class TraxType,
class Base>
207IDType Container_Imp<TraxType,Base>::Add( std::shared_ptr<TraxType> pTraxType ){
211 if(
Decorator()->IsMember( *pTraxType ) ){
212 Decorator()->PushActive( pTraxType->ID() );
213 return pTraxType->ID();
216 if( pTraxType->ID() ){
217 if( !IsFree( pTraxType->ID() ) )
218 throw std::invalid_argument(
"The item ID is already used in the container! ID: " + std::to_string( pTraxType->ID().GetID() ) );
221 pTraxType->ID( GetFree() );
223 m_Container.insert( std::make_pair( pTraxType->ID(), pTraxType ) );
224 Decorator()->PushActive(pTraxType->ID());
226 return pTraxType->ID();
229template<
class TraxType,
class Base>
230IDType Container_Imp<TraxType,Base>::AddRelaxed( std::shared_ptr<TraxType> pTraxType ){
234 if(
Decorator()->IsMember( *pTraxType ) ){
235 Decorator()->PushActive( pTraxType->ID() );
236 return pTraxType->ID();
239 if( pTraxType->ID() ){
240 if( !IsFree( pTraxType->ID() ) )
241 pTraxType->ID( GetFree() );
244 pTraxType->ID( GetFree() );
246 m_Container.insert( std::make_pair( pTraxType->ID(), pTraxType ) );
247 Decorator()->PushActive(pTraxType->ID());
249 return pTraxType->ID();
252template<
class TraxType,
class Base>
253bool Container_Imp<TraxType,Base>::Remove( TraxType* pTraxType,
bool zeroIDs ){
258 const IDType id = pTraxType->ID();
260 if( m_Container.erase(
id ) > 0 )
266 return m_Container.erase( pTraxType->ID() ) > 0;
272template<
class TraxType,
class Base>
273int Container_Imp<TraxType,Base>::Take(
typename Base::collection_type& collection ){
274 const int offset = MaxID();
275 collection.ShiftIDs( offset );
277 auto pTraxType = collection.GetFirst();
279 collection.Remove( pTraxType.get() );
282 pTraxType = collection.GetFirst();
288template<
class TraxType,
class Base>
289std::shared_ptr<TraxType> Container_Imp<TraxType,Base>::GetNext(
const std::shared_ptr<TraxType>& pTraxType )
const{
291 auto iter = m_Container.find( pTraxType->ID() );
292 if( iter != m_Container.end() &&
293 ++iter != m_Container.end() )
294 return (*iter).second;
299template<
class TraxType,
class Base>
300std::shared_ptr<TraxType> Container_Imp<TraxType,Base>::GetPrevious(
const std::shared_ptr<TraxType>& pTraxType )
const{
302 auto iter = m_Container.find( pTraxType->ID() );
303 if( iter != m_Container.end() &&
304 iter != m_Container.begin() )
305 return (*--iter).second;
310template<
class TraxType,
class Base>
311bool Container_Imp<TraxType,Base>::IsMember(
const TraxType& item )
const{
315 const auto iter = m_Container.find( item.ID() );
316 if( iter == m_Container.end() )
319 return iter->second.get() == &item;
322template<
class TraxType,
class Base>
323void Container_Imp<TraxType,Base>::Clear() noexcept{
325 while( !m_ActiveStack.empty() )
329template<
class TraxType,
class Base>
330int Container_Imp<TraxType,Base>::Count() const noexcept{
331 return static_cast<int>(m_Container.size());
334template<
class TraxType,
class Base>
335typename Base::collection_type::iterator Container_Imp<TraxType,Base>::begin() noexcept{
336 return { m_Container.begin() };
339template<
class TraxType,
class Base>
340typename Base::collection_type::iterator Container_Imp<TraxType,Base>::end() noexcept{
341 return { m_Container.end() };
344template<
class TraxType,
class Base>
345typename Base::collection_type::const_iterator Container_Imp<TraxType,Base>::begin() const noexcept{
346 return { m_Container.begin() };
349template<
class TraxType,
class Base>
350typename Base::collection_type::const_iterator Container_Imp<TraxType,Base>::end() const noexcept{
351 return { m_Container.end() };
354template<
class TraxType,
class Base>
355typename Base::collection_type::const_iterator Container_Imp<TraxType,Base>::cbegin() const noexcept{
356 return { m_Container.begin() };
359template<
class TraxType,
class Base>
360typename Base::collection_type::const_iterator Container_Imp<TraxType,Base>::cend() const noexcept{
361 return { m_Container.end() };
364template<
class TraxType,
class Base>
365std::shared_ptr<TraxType> Container_Imp<TraxType,Base>::GetFirst() const noexcept{
366 const auto iter = m_Container.begin();
367 if( iter != m_Container.end() )
368 return (*iter).second;
373template<
class TraxType,
class Base>
374std::shared_ptr<TraxType> Container_Imp<TraxType,Base>::GetLast()
const{
375 const auto iter = m_Container.rbegin();
376 if( iter != m_Container.rend() )
377 return (*iter).second;
382template<
class TraxType,
class Base>
383std::shared_ptr<TraxType> Container_Imp<TraxType,Base>::Get(
IDType id )
const{
384 const auto iter = m_Container.find(
id );
385 if( iter != m_Container.end() )
386 return (*iter).second;
391template<
class TraxType,
class Base>
392std::shared_ptr<TraxType> Container_Imp<TraxType,Base>::Get(
const std::string& name )
const{
393 for(
auto iter = m_Container.begin(); iter != m_Container.end(); ++iter )
394 if( (*iter).second->Reference(
"name" ).compare( name ) == 0 )
395 return (*iter).second;
400template<
class TraxType,
class Base>
401void Container_Imp<TraxType,Base>::PushActive(
IDType id ){
402 m_ActiveStack.push(
id);
405template<
class TraxType,
class Base>
406void Container_Imp<TraxType,Base>::PopActive(){
407 if( m_ActiveStack.empty() )
408 throw std::underflow_error(
"Popped an empty stack!" );
413template<
class TraxType,
class Base>
414std::shared_ptr<TraxType> Container_Imp<TraxType,Base>::GetActive()
const{
415 if( m_ActiveStack.empty() )
418 return Decorator()->Get(m_ActiveStack.top());
421template<
class TraxType,
class Base>
422bool Container_Imp<TraxType,Base>::IsMember(
IDType id )
const{
423 return !IsFree(
id );
426template<
class TraxType,
class Base>
427inline void Container_Imp<TraxType, Base>::ShiftIDs(
int offset ){
428 if( m_Container.empty() )
430 if( MinID().GetID() + offset <= 0 )
431 throw std::out_of_range(
"Can not shift id space." );
433 std::stack<IDType> tempStack;
434 while( !m_ActiveStack.empty() ){
435 tempStack.push( m_ActiveStack.top() + offset );
438 while( !tempStack.empty() ){
439 m_ActiveStack.push( tempStack.top() );
443 ContainerType tempContainer;
444 for(
const auto& pair : m_Container ){
445 pair.second->ID( pair.second->ID() + offset );
446 tempContainer[pair.first+offset] = pair.second;
449 m_Container.swap( tempContainer );
452template<
class TraxType,
class Base>
453inline IDType Container_Imp<TraxType, Base>::MaxID()
const{
454 if( m_Container.empty() )
457 return m_Container.rbegin()->first;
460template<
class TraxType,
class Base>
461inline IDType Container_Imp<TraxType, Base>::MinID()
const{
462 if( m_Container.empty() )
465 return m_Container.begin()->first;
468template<
class TraxType,
class Base>
469void Container_Imp<TraxType, Base>::SetDecorator( Base* pDecorator )
noexcept{
471 m_pDecorator = pDecorator;
476template<
class ContainerType>
477inline bool IsValid_Imp(
const ContainerType& container ){
479 for(
const auto& pair : container ){
480 auto& element = *(pair.second);
481 if( !element.IsValid() ){
The base for decorator implementations. Needed as BaseDecorator to combine other decorator implemente...
Definition ObjectIDDecorator.h:27
Namespace of all the trax track libraries classes and methods.
Definition Collection.h:17
A Frame ("TNBFrame") describes a location in 3d space and an orientation using a right handed coordin...
Definition Frame.h:52
Type used for IDs in the trax library.
Definition IDType.h:43