00001 // Torc - Copyright 2011 University of Southern California. All Rights Reserved. 00002 // $HeadURL: https://torc-isi.svn.sourceforge.net/svnroot/torc-isi/branches/staging/0.9/src/torc/packer/PrimitiveSet.hpp $ 00003 // $Id: PrimitiveSet.hpp 10 2011-10-12 18:40:16Z nsteiner $ 00004 00005 // This program is free software: you can redistribute it and/or modify it under the terms of the 00006 // GNU General Public License as published by the Free Software Foundation, either version 3 of the 00007 // License, or (at your option) any later version. 00008 // 00009 // This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; 00010 // without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 00011 // the GNU General Public License for more details. 00012 // 00013 // You should have received a copy of the GNU General Public License along with this program. If 00014 // not, see <http://www.gnu.org/licenses/>. 00015 00016 /// \file 00017 /// \brief Header for the PrimitiveSet class. 00018 00019 #ifndef TORC_PACKER_PRIMITIVESET_HPP 00020 #define TORC_PACKER_PRIMITIVESET_HPP 00021 00022 #include "torc/packer/Primitive.hpp" 00023 #include <string> 00024 00025 namespace torc { 00026 namespace physical { 00027 00028 /// \brief PrimitiveSet. 00029 00030 class PrimitiveSet : public Named, public Progeny<class PrimitiveSet>, 00031 protected Progenitor<class PrimitiveSet> { 00032 // friends 00033 /// \brief The Factory class has direct access to our internals. 00034 friend class RcFactory; 00035 00036 00037 protected: 00038 // types 00039 /// \brief Imported type name. 00040 typedef std::string string; 00041 // members 00042 /// \brief Vector of primitive shared pointers. 00043 PrimitiveSharedPtrVector mPrimitives; 00044 00045 // constructors 00046 PrimitiveSet(const string& inName) : Named(inName), Progenitor<class PrimitiveSet>(){} 00047 public: 00048 00049 // types 00050 /// \brief Constant iterator for Primitive shared pointers. 00051 typedef PrimitiveSharedPtrVector::const_iterator PrimitiveSharedPtrConstIterator; 00052 /// \brief Non-constant iterator for Primitive shared pointers. 00053 typedef PrimitiveSharedPtrVector::iterator PrimitiveSharedPtrIterator; 00054 // functions 00055 /// \brief Find a PrimitiveSet primitive by name. 00056 /// \param inName The primitive name to look for. 00057 /// \returns an iterator for the specified primitive, or primitivesEnd() if the name was not 00058 /// found. 00059 PrimitiveSharedPtrIterator findPrimitive(const string& inName) { 00060 NameComparator predicate(inName); 00061 return std::find_if(primitivesBegin(), primitivesEnd(), predicate); 00062 } 00063 /// \brief Add a primitive to the PrimitiveSet. 00064 /// \param inPrimitivePtr The primitive to add. 00065 /// \returns true if the primitive was added, or false if a primitive with the same name already 00066 /// exists in the PrimitiveSet. 00067 bool addPrimitive(PrimitiveSharedPtr& inPrimitivePtr) { 00068 /// \todo Acquire mutex. 00069 PrimitiveSharedPtrVector::iterator e = mPrimitives.end(); 00070 PrimitiveSharedPtrVector::iterator result = findPrimitive(inPrimitivePtr->getName()); 00071 if(result == e) mPrimitives.push_back(inPrimitivePtr); 00072 return result == e; // return true if we added the primitive 00073 /// \todo Release mutex. 00074 } 00075 /// \brief Remove a primitive from the PrimitiveSet. 00076 /// \param inPrimitivePtr The primitive to remove. 00077 /// \returns true if the primitive was remove, or false if the primitive did not exist. 00078 bool removePrimitive(PrimitiveSharedPtr& inPrimitivePtr) { 00079 /// \todo Acquire mutex. 00080 PrimitiveSharedPtrVector::iterator e = mPrimitives.end(); 00081 PrimitiveSharedPtrVector::iterator result = std::find(mPrimitives.begin(), e, inPrimitivePtr); 00082 if(result == e) return false; 00083 mPrimitives.erase(result); 00084 /// \todo Release mutex. 00085 return true; 00086 } 00087 00088 00089 // accessors 00090 00091 size_t getPrimitiveCount(void) const { return mPrimitives.size(); } 00092 // iterators 00093 /// \brief Returns the begin constant iterator for primitives. 00094 PrimitiveSharedPtrConstIterator primitivesBegin(void) const { return mPrimitives.begin(); } 00095 /// \brief Returns the end constant iterator for primitives. 00096 PrimitiveSharedPtrConstIterator primitivesEnd(void) const { return mPrimitives.end(); } 00097 /// \brief Returns the begin non-constant iterator for primitives. 00098 PrimitiveSharedPtrIterator primitivesBegin(void) { return mPrimitives.begin(); } 00099 /// \brief Returns the end non-constant iterator for primitives. 00100 PrimitiveSharedPtrIterator primitivesEnd(void) { return mPrimitives.end(); } 00101 00102 }; 00103 00104 /// \brief Shared pointer encapsulation of a PrimitiveSet. 00105 typedef boost::shared_ptr<PrimitiveSet> PrimitiveSetSharedPtr; 00106 00107 /// \brief Shared pointer encapsulation of a PrimitiveSet. 00108 typedef boost::weak_ptr<PrimitiveSet> PrimitiveSetWeakPtr; 00109 00110 /// \brief Vector of PrimitiveSet shared pointers. 00111 typedef std::vector<PrimitiveSetSharedPtr> PrimitiveSetSharedPtrVector; 00112 00113 } // namespace physical 00114 } // namespace torc 00115 00116 #endif // TORC_PACKER_PRIMITIVESET_HPP