MotorControlModuleSDFM_TMS3.../Projects/EFC_Application/UMLibrary/common/Link.hpp

91 lines
1.9 KiB
C++

/*
* TLink.hpp
*
* Created on: 1 íîÿá. 2016 ã.
* Author: titov
*/
#ifndef SOURCE_COMMON_TLINK_HPP_
#define SOURCE_COMMON_TLINK_HPP_
//! Êëàññ äëÿ õðàíåíèÿ ñâÿçåé ìíîãèõ òèïîâ ê îäíîìó.
template<typename T, unsigned int N>
class Link {
private:
struct LinkRecord {
T * used_item;
void * from;
LinkRecord() : used_item(0), from(0)
{}
};
public:
LinkRecord links[N];
public:
//! Ôóíêöèÿ äîáàâëÿåò ñâÿçü â õðàíèëèùå.
bool putLink(void * from, T * to);
//! Ôóíêöèÿ âîçâðàùàåò óêàçàòåëü íà ñâÿçàííûé îáúåêò è óäàëÿåò ñâÿçü èç õðàíèëèùà.
T * popLink(void * from);
//! Ôóíêöèÿ âîçâðàùàåò ïðèçíàê ñâÿçàííîñòè ñ îáúåêòîì.
bool isTiedFrom(void * from);
//! Ôóíêöèÿ âîçâðàùàåò ïðèçíàê òîãî ÷òî ñ îáúåêòîì êòî ëèáî ñâÿçàí.
bool isTiedTo(T * to);
};
template<typename T, unsigned int N>
inline bool Link<T, N>::putLink(void * from, T * to) {
if(!from) return false;
for( int i = 0; i < N; i++)
if(!links[i].from) {
links[i].from = from;
links[i].used_item = to;
return true;
} else if( links[i].from == from
&& links[i].used_item == to )
return true;
return false;
}
template<typename T, unsigned int N>
inline T * Link<T, N>::popLink(void * from) {
T * popped = 0;
if(!from) return popped;
for( int i = 0; i < N; i++)
if(links[i].from == from) {
popped = links[i].used_item;
links[i].from = 0;
links[i].used_item = 0;
break;
}
return popped;
}
template<typename T, unsigned int N>
inline bool Link<T, N>::isTiedFrom(void * from) {
for( int i = 0; i < N; i++)
if(links[i].from == from && links[i].used_item)
return true;
return false;
}
template<typename T, unsigned int N>
inline bool Link<T, N>::isTiedTo(T * to) {
for( int i = 0; i < N; i++)
if(links[i].used_item == to && links[i].from)
return true;
return false;
}
#endif /* SOURCE_COMMON_TLINK_HPP_ */