Мне нужна лёгкая библиотека стандартных шаблонов. Будет использоваться в микроконтроллере, так что места там не особо много, да и с быстродействием напряг. В Keil как-то она как-то косячно реализована. Мне нужны только списки и указатели. Keil добавляет сразу 30Кб со всеми функциями ввода-вывода и пр. Так что хотелось бы что-нибудь стороннее. Должны ведь быть какие-нибудь GNU, GPL или ещё что-нибудь в этом духе.
GoldFinch не думаю, что именно проще. Скорее, лёгкую просто не найти. Главное, чтобы библиотека не была привязана всякими #pragma import и прочими платформенно зависимыми конструкциями к компилятору и железу.
Если нужны только списки и указатели, то можно выдернуть их из любой реализации STL и адаптировать для своих нужд. Мы так работали, остались довольны.
_DEN_, из STLPort, по ходу дела, придётся выковыривать код. Прошу прощения, но я не понимаю, зачем так усложнять библиотеку шаблонов? Почему для каждого класса нельзя сделать свой отдельный хидер с кодом. Кода получается не так уж и много. Берёшь любую библиотеку - там всё завязано на директивах препроцессора, что сходу даже и не разберёшься. Вот, слил STLPort - прописал путь в проекте к папке с библиотекой - не компилится. Т.е. нужно эту библиотеку устанавливать, что мне делать совсем не хочется.
Ещё одна вещь расстраивает. Вот слил palmstl. Вроде, то, что нужно. Ничего лишнего. Добавил в проект - куча ошибок. Видать, на VC вообще не собирается.
cupuyc Скорее всего дело в том, что STL является очень performance critical во всех отношениях, и его стараются выдрочить блеска, в том числе и platform-dependent твиками.
облегчённый двусвязный список. Код (Text): /* * C L i s t */ template <typename t_base_element> class CList { private: struct ListElement { t_base_element element; ListElement *p_next; ListElement *p_prev; }; public: class iterator { private: ListElement *m_p_current; private: friend class CList; private: inline iterator(ListElement* begin) { m_p_current = begin; } public: inline iterator(iterator& from) { m_p_current = from.m_p_current; } inline void operator ++ (int) { m_p_current = m_p_current->p_next; } inline void operator -- (int) { m_p_current = m_p_current->p_prev; } inline t_base_element& operator *() const { return m_p_current->element; } inline bool is_end() const { return m_p_current == 0; } }; protected: ListElement *m_p_first; ListElement *m_p_last; public: CList() { m_p_first = 0; m_p_last = 0; } ~CList() { } t_base_element& push_back() { ListElement *new_element = new ListElement; new_element->p_next = 0; new_element->p_prev = m_p_last; if (m_p_last) m_p_last->p_next = new_element; else m_p_first = new_element; m_p_last = new_element; return m_p_last->element; } t_base_element& push_front() { ListElement *new_element = new ListElement; new_element->p_prev = 0; new_element->p_next = m_p_first; if (m_p_first) m_p_first->p_prev = new_element; else m_p_last = new_element; m_p_first = new_element; return m_p_first->element; } t_base_element& push_back(const t_base_element& element) { ListElement *new_element = new ListElement; new_element->p_next = 0; new_element->p_prev = m_p_last; new_element->element = element; if (m_p_last) m_p_last->p_next = new_element; else m_p_first = new_element; m_p_last = new_element; return m_p_last->element; } t_base_element& push_front(const t_base_element& element) { ListElement *new_element = new ListElement; new_element->p_prev = 0; new_element->p_next = m_p_first; new_element->element = element; if (m_p_first) m_p_first->p_prev = new_element; else m_p_last = new_element; m_p_first = new_element; return m_p_first->element; } void clear() { for (iterator &i = first(); !i.is_end(); ) { i = remove(i); } } iterator remove(iterator& index) { if (index.m_p_current == m_p_first) { m_p_first = m_p_first->p_next; delete index.m_p_current; if (m_p_first == 0) m_p_last = 0; else m_p_first->p_prev = 0; return first(); } if (index.m_p_current == m_p_last) { m_p_last = m_p_last->p_prev; m_p_last->p_next = 0; delete index.m_p_current; return last(); } iterator res = index; ++ res; index.m_p_current->p_prev->p_next = index.m_p_current->p_next; index.m_p_current->p_next->p_prev = index.m_p_current->p_prev; delete index.m_p_current; return res; } inline iterator first() const { return iterator(m_p_first); } inline iterator last() const { return iterator(m_p_last); } };
автоуказатель. Код (Text): #ifndef __auto_ptr__h__ #define __auto_ptr__h__ /* * C A u t o P t r */ template <typename t_base> class CAutoPtr { private: t_base *m_p; public: CAutoPtr() { m_p = 0; } CAutoPtr(CAutoPtr<t_base> &ptr) { m_p = ptr.detach(); } CAutoPtr(t_base *p) { m_p = p; } ~CAutoPtr() { free(); } void free() { if (m_p != 0) delete m_p; m_p = 0; } void attach(t_base *p) { if (m_p != 0) throw new CError(ecMemoryLeaks); m_p = p; } t_base* detach() { t_base* p = m_p; m_p = 0; return p; } inline t_base* operator -> () const { return m_p; } CAutoPtr<t_base>& operator = (CAutoPtr<t_base>& ptr) { if (m_p == ptr.m_p) { throw new CError(ecInvalidArgument); } free(); attach(ptr.detach()); return *this; } inline operator t_base* () const { return m_p; } }; #endif // __auto_ptr__h__
STLPort навороченная поскольку поддерживает разные бажные борланды. Для твоих нужд наверно хватит оригинальной HP STL
inline operator t_base* () const То есть можно неявно сохранить указатель, std::auto_ptr не имеет такой проблемы, поэтому я бы рекомендовал использовать проверенный дизайн вместо велосипеда. Еще лучше unique_ptr, его можно хранить в std::list.
Семантика авто поинтера это обеспечивать управление памятью за счет монопольного владения объекта. Неужали буквы ATL как-то защищают от возможных ошибок?
cupuyc STL разрабатывают самые светлые умы планеты, а ATL - не обремененный вселенской гармонией Microsoft.
Во первых, в std::auto_ptr приведение к голому указателю делается явно вызовом get(), или release() поэтому случайной ошибки быть не может по дизайну, название не играет роли. Во вторых, количество пользователей STL несравнимо больше ATL, что позволило выявить проблемы и у auto_ptr, поэтому его апгрейдили до unique_ptr. В третих.... а в третьих итераторы ATL lits не совместимы с алгоритмами STL !!!111 то есть придется писать новый код вместо готового )
J0E, _DEN_, я ведь не спорю, что взять готовую STL библиотеку - идеальный вариант. Другое дело, что мне нужно 500 строк кода, а чтобы выдрать их из STLPort нужно потратить больше времени, чем написать.