91 lines
1.9 KiB
C++
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_ */
|