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

91 lines
2.1 KiB
C++
Raw Normal View History

2024-06-07 11:12:56 +03:00
/*
* 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_ */