/* * TLink.hpp * * Created on: 1 нояб. 2016 г. * Author: titov */ #ifndef SOURCE_COMMON_TLINK_HPP_ #define SOURCE_COMMON_TLINK_HPP_ //! Класс для хранения связей многих типов к одному. template 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 inline bool Link::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 inline T * Link::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 inline bool Link::isTiedFrom(void * from) { for( int i = 0; i < N; i++) if(links[i].from == from && links[i].used_item) return true; return false; } template inline bool Link::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_ */