/* * Copyright (C) 2009-2012 Geometer Plus * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301, USA. */ #ifndef __TAG_H__ #define __TAG_H__ #include #include #include #include "Lists.h" class Tag { private: static TagList ourRootTags; static std::map > ourTagsById; public: static shared_ptr getTag(const std::string &name, shared_ptr parent = 0, int tagId = 0); static shared_ptr getTagByFullName(const std::string &fullName); static shared_ptr getTagById(int tagId); static void setTagId(shared_ptr, int tagId); static shared_ptr cloneSubTag(shared_ptr tag, shared_ptr oldparent, shared_ptr newparent); static void collectAncestors(shared_ptr tag, TagList &parents); static void collectTagNames(std::vector &tags); private: static const std::string DELIMITER; private: Tag(const std::string &name, shared_ptr parent, int tagId); public: const std::string &fullName() const; const std::string &name() const; shared_ptr parent() const; public: bool isAncestorOf(shared_ptr tag) const; int tagId() const; std::size_t level() const; private: const std::string myName; mutable std::string myFullName; shared_ptr myParent; TagList myChildren; const std::size_t myLevel; int myTagId; private: // disable copying Tag(const Tag &); const Tag &operator = (const Tag &); }; class TagComparator { public: bool operator () ( shared_ptr tag0, shared_ptr tag1 ) const; }; inline const std::string &Tag::name() const { return myName; } inline shared_ptr Tag::parent() const { return myParent; } inline int Tag::tagId() const { return myTagId; } inline std::size_t Tag::level() const { return myLevel; } #endif /* __TAG_H__ */