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