1 /* EList class declaration.
2    Copyright (C) 2001-2010 Roberto Bagnara <bagnara@cs.unipr.it>
3    Copyright (C) 2010-2016 BUGSENG srl (http://bugseng.com)
4 
5 This file is part of the Parma Polyhedra Library (PPL).
6 
7 The PPL is free software; you can redistribute it and/or modify it
8 under the terms of the GNU General Public License as published by the
9 Free Software Foundation; either version 3 of the License, or (at your
10 option) any later version.
11 
12 The PPL is distributed in the hope that it will be useful, but WITHOUT
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15 for more details.
16 
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software Foundation,
19 Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
20 
21 For the most up-to-date information see the Parma Polyhedra Library
22 site: http://bugseng.com/products/ppl/ . */
23 
24 #ifndef PPL_EList_defs_hh
25 #define PPL_EList_defs_hh 1
26 
27 #include "EList_types.hh"
28 #include "Doubly_Linked_Object_defs.hh"
29 #include "EList_Iterator_defs.hh"
30 
31 /*! \brief
32   A simple kind of embedded list (i.e., a doubly linked objects
33   where the links are embedded in the objects themselves).
34 */
35 template <typename T>
36 class Parma_Polyhedra_Library::Implementation::EList
37   : private Doubly_Linked_Object {
38 public:
39   //! A const iterator to traverse the list.
40   typedef EList_Iterator<const T> const_iterator;
41 
42   //! A non-const iterator to traverse the list.
43   typedef EList_Iterator<T> iterator;
44 
45   //! Constructs an empty list.
46   EList();
47 
48   //! Destructs the list and all the elements in it.
49   ~EList();
50 
51   //! Pushes \p obj to the front of the list.
52   void push_front(T& obj);
53 
54   //! Pushes \p obj to the back of the list.
55   void push_back(T& obj);
56 
57   /*! \brief
58     Inserts \p obj just before \p position and returns an iterator
59     that points to the inserted object.
60   */
61   iterator insert(iterator position, T& obj);
62 
63   /*! \brief
64     Removes the element pointed to by \p position, returning
65     an iterator pointing to the next element, if any, or end(), otherwise.
66   */
67   iterator erase(iterator position);
68 
69   //! Returns <CODE>true</CODE> if and only if the list is empty.
70   bool empty() const;
71 
72   //! Returns an iterator pointing to the beginning of the list.
73   iterator begin();
74 
75   //! Returns an iterator pointing one past the last element in the list.
76   iterator end();
77 
78   //! Returns a const iterator pointing to the beginning of the list.
79   const_iterator begin() const;
80 
81   //! Returns a const iterator pointing one past the last element in the list.
82   const_iterator end() const;
83 
84   //! Checks if all the invariants are satisfied.
85   bool OK() const;
86 };
87 
88 #include "EList_inlines.hh"
89 
90 #endif // !defined(PPL_EList_defs_hh)
91