sc_list.h revision 12027
112771Sqtt2@cornell.edu/*****************************************************************************
212771Sqtt2@cornell.edu
312771Sqtt2@cornell.edu  Licensed to Accellera Systems Initiative Inc. (Accellera) under one or
412771Sqtt2@cornell.edu  more contributor license agreements.  See the NOTICE file distributed
512771Sqtt2@cornell.edu  with this work for additional information regarding copyright ownership.
612771Sqtt2@cornell.edu  Accellera licenses this file to you under the Apache License, Version 2.0
712771Sqtt2@cornell.edu  (the "License"); you may not use this file except in compliance with the
812771Sqtt2@cornell.edu  License.  You may obtain a copy of the License at
912771Sqtt2@cornell.edu
1012771Sqtt2@cornell.edu    http://www.apache.org/licenses/LICENSE-2.0
1112771Sqtt2@cornell.edu
1212771Sqtt2@cornell.edu  Unless required by applicable law or agreed to in writing, software
1312771Sqtt2@cornell.edu  distributed under the License is distributed on an "AS IS" BASIS,
1412771Sqtt2@cornell.edu  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
1512771Sqtt2@cornell.edu  implied.  See the License for the specific language governing
1612771Sqtt2@cornell.edu  permissions and limitations under the License.
1712771Sqtt2@cornell.edu
1812771Sqtt2@cornell.edu *****************************************************************************/
1912771Sqtt2@cornell.edu
2012771Sqtt2@cornell.edu/*****************************************************************************
2112771Sqtt2@cornell.edu
2212771Sqtt2@cornell.edu  sc_list.h -- Simple implementation of a doubly linked list.
2312771Sqtt2@cornell.edu
2412771Sqtt2@cornell.edu  Original Author: Stan Y. Liao, Synopsys, Inc.
2512771Sqtt2@cornell.edu
2612771Sqtt2@cornell.edu  CHANGE LOG AT END OF FILE
2712771Sqtt2@cornell.edu *****************************************************************************/
2812771Sqtt2@cornell.edu
2912771Sqtt2@cornell.edu
3012771Sqtt2@cornell.edu#ifndef SC_LIST_H
3112771Sqtt2@cornell.edu#define SC_LIST_H
3212771Sqtt2@cornell.edu
3312771Sqtt2@cornell.edunamespace sc_core {
3412771Sqtt2@cornell.edu
3512771Sqtt2@cornell.edu//Some forward declarations
3612771Sqtt2@cornell.educlass sc_plist_elem;
3712771Sqtt2@cornell.edutemplate<class T> class sc_plist_iter;
3812771Sqtt2@cornell.edu
3912771Sqtt2@cornell.edutypedef void (*sc_plist_map_fn)( void* data, void* arg );
4012771Sqtt2@cornell.edu
4112771Sqtt2@cornell.educlass sc_plist_base {
4212771Sqtt2@cornell.edu    friend class sc_plist_base_iter;
4312771Sqtt2@cornell.edu
4412771Sqtt2@cornell.edupublic:
4512771Sqtt2@cornell.edu    sc_plist_base();
4612771Sqtt2@cornell.edu    ~sc_plist_base();
4712771Sqtt2@cornell.edu
4812771Sqtt2@cornell.edu    typedef sc_plist_elem* handle_t;
4912771Sqtt2@cornell.edu
5012771Sqtt2@cornell.edu    handle_t push_back(void* d);
5112771Sqtt2@cornell.edu    handle_t push_front(void* d);
5212771Sqtt2@cornell.edu    void* pop_back();
5312771Sqtt2@cornell.edu    void* pop_front();
5412771Sqtt2@cornell.edu    handle_t insert_before(handle_t h, void* d);
5512771Sqtt2@cornell.edu    handle_t insert_after(handle_t h, void* d);
5612771Sqtt2@cornell.edu    void* remove(handle_t h);
5712771Sqtt2@cornell.edu    void* get(handle_t h) const;
5812771Sqtt2@cornell.edu    void set(handle_t h, void* d);
5912771Sqtt2@cornell.edu    void mapcar( sc_plist_map_fn f, void* arg );
6012771Sqtt2@cornell.edu
61    void* front() const;
62    void* back() const;
63
64    void erase_all();
65    bool empty() const { return (head == 0); }
66    int size() const;
67
68private:
69    handle_t head;
70    handle_t tail;
71};
72
73
74class sc_plist_base_iter {
75public:
76    typedef sc_plist_elem* handle_t;
77
78    sc_plist_base_iter( sc_plist_base* l, bool from_tail = false );
79    ~sc_plist_base_iter();
80
81    void reset( sc_plist_base* l, bool from_tail = false );
82    bool empty() const;
83    void operator++(int);
84    void operator--(int);
85    void* get() const;
86    void  set(void* d);
87    void remove();
88    void remove(int direction);
89
90    void set_handle(handle_t h);
91    handle_t get_handle() const { return ptr; }
92
93private:
94    sc_plist_base* lst;
95    sc_plist_elem* ptr;
96};
97
98/*---------------------------------------------------------------------------*/
99
100template< class T >
101class sc_plist : public sc_plist_base {
102    friend class sc_plist_iter <T>;
103
104public:
105    typedef sc_plist_iter<T> iterator;
106
107    sc_plist() { }
108    ~sc_plist() { }
109
110    handle_t push_back(T d)  { return sc_plist_base::push_back((void*)d);  }
111    handle_t push_front(T d) { return sc_plist_base::push_front((void*)d); }
112    T pop_back()           { return (T) sc_plist_base::pop_back(); }
113    T pop_front()          { return (T) sc_plist_base::pop_front(); }
114    handle_t insert_before(handle_t h, T d)
115    {
116        return sc_plist_base::insert_before(h, (void*) d);
117    }
118    handle_t insert_after(handle_t h, T d)
119    {
120        return sc_plist_base::insert_after(h, (void*) d);
121    }
122    T remove(handle_t h)
123    {
124        return (T)sc_plist_base::remove(h);
125    }
126    T get(handle_t h) const { return (T)sc_plist_base::get(h); }
127    void set(handle_t h, T d) { sc_plist_base::set(h, (void*)d); }
128
129    T front() const { return (T)sc_plist_base::front(); }
130    T back() const { return (T)sc_plist_base::back(); }
131};
132
133template< class T >
134class sc_plist_iter : public sc_plist_base_iter {
135public:
136    sc_plist_iter( sc_plist<T>* l, bool from_tail = false )
137        : sc_plist_base_iter( l, from_tail )
138    {
139
140    }
141    sc_plist_iter( sc_plist<T>& l, bool from_tail = false )
142        : sc_plist_base_iter( &l, from_tail )
143    {
144
145    }
146    ~sc_plist_iter()
147    {
148
149    }
150
151    void reset( sc_plist<T>* l, bool from_tail = false )
152    {
153        sc_plist_base_iter::reset( l, from_tail );
154    }
155    void reset( sc_plist<T>& l, bool from_tail = false )
156    {
157        sc_plist_base_iter::reset( &l, from_tail );
158    }
159
160    T operator*() const { return (T) sc_plist_base_iter::get(); }
161    T get() const     { return (T) sc_plist_base_iter::get(); }
162    void set(T d)     { sc_plist_base_iter::set((void*) d); }
163};
164
165} // namespace sc_core
166
167// $Log: sc_list.h,v $
168// Revision 1.5  2011/09/01 15:16:50  acg
169//  Philipp A. Hartmann: revert unnecessary virtual destructors.
170//
171// Revision 1.4  2011/08/26 20:46:18  acg
172//  Andy Goodrich: moved the modification log to the end of the file to
173//  eliminate source line number skew when check-ins are done.
174//
175// Revision 1.3  2011/08/24 22:05:56  acg
176//  Torsten Maehne: initialization changes to remove warnings.
177//
178// Revision 1.2  2011/02/18 20:38:44  acg
179//  Andy Goodrich: Updated Copyright notice.
180//
181// Revision 1.1.1.1  2006/12/15 20:20:06  acg
182// SystemC 2.3
183//
184// Revision 1.3  2006/01/13 18:53:10  acg
185// Andy Goodrich: Added $Log command so that CVS comments are reproduced in
186// the source.
187
188#endif
189