| /***************************************************************************** | |
| Licensed to Accellera Systems Initiative Inc. (Accellera) under one or | |
| more contributor license agreements. See the NOTICE file distributed | |
| with this work for additional information regarding copyright ownership. | |
| Accellera licenses this file to you under the Apache License, Version 2.0 | |
| (the "License"); you may not use this file except in compliance with the | |
| License. You may obtain a copy of the License at | |
| http://www.apache.org/licenses/LICENSE-2.0 | |
| Unless required by applicable law or agreed to in writing, software | |
| distributed under the License is distributed on an "AS IS" BASIS, | |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or | |
| implied. See the License for the specific language governing | |
| permissions and limitations under the License. | |
| *****************************************************************************/ | |
| /***************************************************************************** | |
| sc_vector.h -- Simple implementation of a vector class. | |
| Original Author: Stan Y. Liao, Synopsys, Inc. | |
| CHANGE LOG AT END OF FILE | |
| *****************************************************************************/ | |
| #ifndef SC_VECTOR_H | |
| #define SC_VECTOR_H | |
| #include <vector> | |
| namespace sc_core { | |
| extern "C" { | |
| typedef int (*CFT)( const void*, const void* ); | |
| } | |
| // #define ACCESS(I) m_vector.at(I) // index checking | |
| #define ACCESS(I) m_vector[I] | |
| #define ADDR_ACCESS(I) (m_vector.size() != 0 ? &m_vector[I] : 0 ) | |
| // ---------------------------------------------------------------------------- | |
| // CLASS : sc_pvector<T> | |
| // | |
| // Simple vector class. | |
| // ---------------------------------------------------------------------------- | |
| template< class T > | |
| class sc_pvector | |
| { | |
| public: | |
| typedef const T* const_iterator; | |
| typedef T* iterator; | |
| // typedef typename ::std::vector<T>::const_iterator const_iterator; | |
| // typedef typename ::std::vector<T>::iterator iterator; | |
| sc_pvector( int alloc_n = 0 ) | |
| { | |
| } | |
| sc_pvector( const sc_pvector<T>& rhs ) | |
| : m_vector( rhs.m_vector ) | |
| {} | |
| ~sc_pvector() | |
| {} | |
| std::size_t size() const | |
| { return m_vector.size(); } | |
| iterator begin() | |
| { return (iterator) ADDR_ACCESS(0); } | |
| const_iterator begin() const | |
| { return (const_iterator) ADDR_ACCESS(0); } | |
| iterator end() | |
| { return static_cast<iterator> (ADDR_ACCESS(m_vector.size())); } | |
| const_iterator end() const | |
| { | |
| return static_cast<const_iterator> (ADDR_ACCESS(m_vector.size())); | |
| } | |
| sc_pvector<T>& operator = ( const sc_pvector<T>& rhs ) | |
| { m_vector = rhs.m_vector; return *this; } | |
| T& operator [] ( unsigned int i ) | |
| { | |
| if ( i >= m_vector.size() ) m_vector.resize(i+1); | |
| return (T&) m_vector.operator [] ( i ); | |
| } | |
| const T& operator [] ( unsigned int i ) const | |
| { | |
| if ( i >= m_vector.size() ) m_vector.resize(i+1); | |
| return (const T&) m_vector.operator [] ( i ); | |
| } | |
| T& fetch( int i ) | |
| { return ACCESS(i); } | |
| const T& fetch( int i ) const | |
| { return (const T&) ACCESS(i); } | |
| T* raw_data() | |
| { return (T*) &ACCESS(0); } | |
| const T* raw_data() const | |
| { return (const T*) &ACCESS(0); } | |
| operator const ::std::vector<T>& () const | |
| { return m_vector; } | |
| void push_back( T item ) | |
| { m_vector.push_back( item ); } | |
| void erase_all() | |
| { m_vector.resize(0); } | |
| void sort( CFT compar ) | |
| {qsort( (void*)&m_vector[0], m_vector.size(), sizeof(void*), compar );} | |
| /* These methods have been added from Ptr_Array */ | |
| void put( T item, int i ) | |
| { ACCESS(i) = item; } | |
| void decr_count() | |
| { m_vector.resize(m_vector.size()-1); } | |
| void decr_count( int k ) | |
| { m_vector.resize(m_vector.size()-k); } | |
| protected: | |
| mutable ::std::vector<T> m_vector; // Actual vector of pointers. | |
| }; | |
| #undef ACCESS | |
| #undef ADDR_ACCESS | |
| } // namespace sc_core | |
| // $Log: sc_pvector.h,v $ | |
| // Revision 1.4 2011/08/26 20:46:19 acg | |
| // Andy Goodrich: moved the modification log to the end of the file to | |
| // eliminate source line number skew when check-ins are done. | |
| // | |
| // Revision 1.3 2011/02/18 20:38:44 acg | |
| // Andy Goodrich: Updated Copyright notice. | |
| // | |
| // Revision 1.2 2011/01/20 16:52:21 acg | |
| // Andy Goodrich: changes for IEEE 1666 2011. | |
| // | |
| // Revision 1.1 2010/12/07 20:11:45 acg | |
| // Andy Goodrich: moved sc_pvector class to new header file to allow the | |
| // use of sc_vector.h for Philipp Hartmann's new sc_vector class. | |
| // | |
| // Revision 1.4 2010/08/03 17:52:15 acg | |
| // Andy Goodrich: fix signature for size() method of sc_pvector. | |
| // | |
| // Revision 1.3 2008/10/09 21:20:33 acg | |
| // Andy Goodrich: fixed the way the end() methods calculate their results. | |
| // I had incorrectly cut and pasted code from the begin() method. | |
| // | |
| // Revision 1.2 2007/01/17 22:44:34 acg | |
| // Andy Goodrich: fix for Microsoft compiler. | |
| // | |
| // Revision 1.3 2006/01/13 18:53:11 acg | |
| // Andy Goodrich: Added $Log command so that CVS comments are reproduced in | |
| // the source. | |
| // | |
| #endif |