MotorControlModuleSDFM_TMS3.../Projects/EFC_Communication/UMLibrary/common/Link.hpp
2024-06-07 11:12:56 +03:00

91 lines
2.1 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* 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_ */