| <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> |
| <html xmlns="http://www.w3.org/1999/xhtml"> |
| <head> |
| <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> |
| <title>activemq-cpp-3.4.0: src/main/decaf/util/LinkedList.h Source File</title> |
| <link href="tabs.css" rel="stylesheet" type="text/css"/> |
| <link href="navtree.css" rel="stylesheet" type="text/css"/> |
| <script type="text/javascript" src="jquery.js"></script> |
| <script type="text/javascript" src="navtree.js"></script> |
| <script type="text/javascript" src="resize.js"></script> |
| <script type="text/javascript"> |
| $(document).ready(initResizable); |
| </script> |
| <link href="doxygen.css" rel="stylesheet" type="text/css"/> |
| </head> |
| <body> |
| <!-- Generated by Doxygen 1.7.3 --> |
| <div id="top"> |
| <div id="titlearea"> |
| <table cellspacing="0" cellpadding="0"> |
| <tbody> |
| <tr style="height: 56px;"> |
| <td style="padding-left: 0.5em;"> |
| <div id="projectname">activemq-cpp-3.4.0</div> |
| </td> |
| </tr> |
| </tbody> |
| </table> |
| </div> |
| <div id="navrow1" class="tabs"> |
| <ul class="tablist"> |
| <li><a href="index.html"><span>Main Page</span></a></li> |
| <li><a href="namespaces.html"><span>Namespaces</span></a></li> |
| <li><a href="annotated.html"><span>Data Structures</span></a></li> |
| <li class="current"><a href="files.html"><span>Files</span></a></li> |
| </ul> |
| </div> |
| <div id="navrow2" class="tabs2"> |
| <ul class="tablist"> |
| <li><a href="files.html"><span>File List</span></a></li> |
| <li><a href="globals.html"><span>Globals</span></a></li> |
| </ul> |
| </div> |
| </div> |
| <div id="side-nav" class="ui-resizable side-nav-resizable"> |
| <div id="nav-tree"> |
| <div id="nav-tree-contents"> |
| </div> |
| </div> |
| <div id="splitbar" style="-moz-user-select:none;" |
| class="ui-resizable-handle"> |
| </div> |
| </div> |
| <script type="text/javascript"> |
| initNavTree('_linked_list_8h.html',''); |
| </script> |
| <div id="doc-content"> |
| <div class="header"> |
| <div class="headertitle"> |
| <h1>src/main/decaf/util/LinkedList.h</h1> </div> |
| </div> |
| <div class="contents"> |
| <a href="_linked_list_8h.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span> |
| <a name="l00002"></a>00002 <span class="comment"> * Licensed to the Apache Software Foundation (ASF) under one or more</span> |
| <a name="l00003"></a>00003 <span class="comment"> * contributor license agreements. See the NOTICE file distributed with</span> |
| <a name="l00004"></a>00004 <span class="comment"> * this work for additional information regarding copyright ownership.</span> |
| <a name="l00005"></a>00005 <span class="comment"> * The ASF licenses this file to You under the Apache License, Version 2.0</span> |
| <a name="l00006"></a>00006 <span class="comment"> * (the "License"); you may not use this file except in compliance with</span> |
| <a name="l00007"></a>00007 <span class="comment"> * the License. You may obtain a copy of the License at</span> |
| <a name="l00008"></a>00008 <span class="comment"> *</span> |
| <a name="l00009"></a>00009 <span class="comment"> * http://www.apache.org/licenses/LICENSE-2.0</span> |
| <a name="l00010"></a>00010 <span class="comment"> *</span> |
| <a name="l00011"></a>00011 <span class="comment"> * Unless required by applicable law or agreed to in writing, software</span> |
| <a name="l00012"></a>00012 <span class="comment"> * distributed under the License is distributed on an "AS IS" BASIS,</span> |
| <a name="l00013"></a>00013 <span class="comment"> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span> |
| <a name="l00014"></a>00014 <span class="comment"> * See the License for the specific language governing permissions and</span> |
| <a name="l00015"></a>00015 <span class="comment"> * limitations under the License.</span> |
| <a name="l00016"></a>00016 <span class="comment"> */</span> |
| <a name="l00017"></a>00017 |
| <a name="l00018"></a>00018 <span class="preprocessor">#ifndef _DECAF_UTIL_LINKEDLIST_H_</span> |
| <a name="l00019"></a>00019 <span class="preprocessor"></span><span class="preprocessor">#define _DECAF_UTIL_LINKEDLIST_H_</span> |
| <a name="l00020"></a>00020 <span class="preprocessor"></span> |
| <a name="l00021"></a>00021 <span class="preprocessor">#include <list></span> |
| <a name="l00022"></a>00022 <span class="preprocessor">#include <memory></span> |
| <a name="l00023"></a>00023 <span class="preprocessor">#include <decaf/util/NoSuchElementException.h></span> |
| <a name="l00024"></a>00024 <span class="preprocessor">#include <decaf/lang/exceptions/UnsupportedOperationException.h></span> |
| <a name="l00025"></a>00025 <span class="preprocessor">#include <decaf/lang/exceptions/IndexOutOfBoundsException.h></span> |
| <a name="l00026"></a>00026 <span class="preprocessor">#include <decaf/lang/System.h></span> |
| <a name="l00027"></a>00027 <span class="preprocessor">#include <decaf/lang/Integer.h></span> |
| <a name="l00028"></a>00028 <span class="preprocessor">#include <decaf/util/Config.h></span> |
| <a name="l00029"></a>00029 <span class="preprocessor">#include <decaf/util/Deque.h></span> |
| <a name="l00030"></a>00030 <span class="preprocessor">#include <decaf/util/ArrayList.h></span> |
| <a name="l00031"></a>00031 <span class="preprocessor">#include <decaf/util/Iterator.h></span> |
| <a name="l00032"></a>00032 <span class="preprocessor">#include <decaf/util/ListIterator.h></span> |
| <a name="l00033"></a>00033 <span class="preprocessor">#include <decaf/util/AbstractSequentialList.h></span> |
| <a name="l00034"></a>00034 |
| <a name="l00035"></a>00035 <span class="keyword">namespace </span>decaf { |
| <a name="l00036"></a>00036 <span class="keyword">namespace </span>util { |
| <a name="l00037"></a>00037 |
| <a name="l00038"></a>00038 <span class="keyword">using</span> <a class="code" href="classdecaf_1_1lang_1_1_system.html" title="The System class provides static methods for accessing system level resources and performing some sys...">decaf::lang::System</a>; |
| <a name="l00039"></a>00039 |
| <a name="l00054"></a>00054 <span class="keyword">template</span>< <span class="keyword">typename</span> E > |
| <a name="l00055"></a><a class="code" href="classdecaf_1_1util_1_1_linked_list.html">00055</a> <span class="keyword">class </span><a class="code" href="classdecaf_1_1util_1_1_linked_list.html" title="A complete implementation of the List interface using a doubly linked list data structure.">LinkedList</a> : <span class="keyword">public</span> <a class="code" href="classdecaf_1_1util_1_1_abstract_sequential_list.html" title="This class provides a skeletal implementation of the List interface to minimize the effort required t...">AbstractSequentialList</a><E>, <span class="keyword">public</span> <a class="code" href="classdecaf_1_1util_1_1_deque.html" title="Defines a &#39;Double ended Queue&#39; interface that allows for insertion and removal of elements fr...">Deque</a><E> { |
| <a name="l00056"></a>00056 <span class="keyword">private</span>: |
| <a name="l00057"></a>00057 |
| <a name="l00058"></a>00058 <span class="keyword">template</span>< <span class="keyword">typename</span> U > |
| <a name="l00059"></a>00059 <span class="keyword">class </span>ListNode { |
| <a name="l00060"></a>00060 <span class="keyword">public</span>: |
| <a name="l00061"></a>00061 |
| <a name="l00062"></a>00062 U value; |
| <a name="l00063"></a>00063 ListNode<U>* prev; |
| <a name="l00064"></a>00064 ListNode<U>* next; |
| <a name="l00065"></a>00065 |
| <a name="l00066"></a>00066 <span class="keyword">private</span>: |
| <a name="l00067"></a>00067 |
| <a name="l00068"></a>00068 ListNode( <span class="keyword">const</span> ListNode& ); |
| <a name="l00069"></a>00069 ListNode& <a class="code" href="classdecaf_1_1util_1_1_linked_list.html#ae1732bd9aa9f31ad0fb44811cc55a150">operator= </a>( <span class="keyword">const</span> ListNode& ); |
| <a name="l00070"></a>00070 |
| <a name="l00071"></a>00071 <span class="keyword">public</span>: |
| <a name="l00072"></a>00072 |
| <a name="l00073"></a>00073 ListNode() : value(), prev(NULL), next(NULL) { |
| <a name="l00074"></a>00074 } |
| <a name="l00075"></a>00075 |
| <a name="l00076"></a>00076 ListNode( <span class="keyword">const</span> U& value ) : value(value), prev(NULL), next(NULL) { |
| <a name="l00077"></a>00077 } |
| <a name="l00078"></a>00078 |
| <a name="l00079"></a>00079 ListNode( ListNode<U>* prev, ListNode<U>* next, <span class="keyword">const</span> U& value ) : |
| <a name="l00080"></a>00080 value(value), prev(prev), next(next) { |
| <a name="l00081"></a>00081 } |
| <a name="l00082"></a>00082 |
| <a name="l00083"></a>00083 }; |
| <a name="l00084"></a>00084 |
| <a name="l00085"></a>00085 <span class="keyword">private</span>: |
| <a name="l00086"></a>00086 |
| <a name="l00087"></a>00087 <span class="keywordtype">int</span> listSize; |
| <a name="l00088"></a>00088 ListNode<E> head; |
| <a name="l00089"></a>00089 ListNode<E> tail; |
| <a name="l00090"></a>00090 |
| <a name="l00091"></a>00091 <span class="keyword">public</span>: |
| <a name="l00092"></a>00092 |
| <a name="l00093"></a><a class="code" href="classdecaf_1_1util_1_1_linked_list.html#adb90effea4ae7e3766c4d5ba9977b4aa">00093</a> <a class="code" href="classdecaf_1_1util_1_1_linked_list.html#adb90effea4ae7e3766c4d5ba9977b4aa">LinkedList</a>() : |
| <a name="l00094"></a>00094 <a class="code" href="classdecaf_1_1util_1_1_abstract_sequential_list.html" title="This class provides a skeletal implementation of the List interface to minimize the effort required t...">AbstractSequentialList</a><E>(), listSize(0), head(), tail() { |
| <a name="l00095"></a>00095 |
| <a name="l00096"></a>00096 this->head.next = &this->tail; |
| <a name="l00097"></a>00097 this->tail.prev = &this->head; |
| <a name="l00098"></a>00098 } |
| <a name="l00099"></a>00099 |
| <a name="l00100"></a><a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a8a6a2550551f5acb2554b9a476f24271">00100</a> <a class="code" href="classdecaf_1_1util_1_1_linked_list.html#adb90effea4ae7e3766c4d5ba9977b4aa">LinkedList</a>( <span class="keyword">const</span> <a class="code" href="classdecaf_1_1util_1_1_linked_list.html" title="A complete implementation of the List interface using a doubly linked list data structure.">LinkedList<E></a>& list ) : |
| <a name="l00101"></a>00101 <a class="code" href="classdecaf_1_1util_1_1_abstract_sequential_list.html" title="This class provides a skeletal implementation of the List interface to minimize the effort required t...">AbstractSequentialList</a><E>(), listSize(0), head(), tail() { |
| <a name="l00102"></a>00102 |
| <a name="l00103"></a>00103 this->head.next = &this->tail; |
| <a name="l00104"></a>00104 this->tail.prev = &this->head; |
| <a name="l00105"></a>00105 |
| <a name="l00106"></a>00106 this->addAllAtLocation( 0, list ); |
| <a name="l00107"></a>00107 } |
| <a name="l00108"></a>00108 |
| <a name="l00109"></a><a class="code" href="classdecaf_1_1util_1_1_linked_list.html#af26f64270b48599ac73481a54b8ae5cd">00109</a> <a class="code" href="classdecaf_1_1util_1_1_linked_list.html#adb90effea4ae7e3766c4d5ba9977b4aa">LinkedList</a>( <span class="keyword">const</span> <a class="code" href="classdecaf_1_1util_1_1_collection.html" title="The root interface in the collection hierarchy.">Collection<E></a>& collection ) : |
| <a name="l00110"></a>00110 <a class="code" href="classdecaf_1_1util_1_1_abstract_sequential_list.html" title="This class provides a skeletal implementation of the List interface to minimize the effort required t...">AbstractSequentialList</a><E>(), listSize(0), head(), tail() { |
| <a name="l00111"></a>00111 |
| <a name="l00112"></a>00112 this->head.next = &this->tail; |
| <a name="l00113"></a>00113 this->tail.prev = &this->head; |
| <a name="l00114"></a>00114 |
| <a name="l00115"></a>00115 this->addAllAtLocation( 0, collection ); |
| <a name="l00116"></a>00116 } |
| <a name="l00117"></a>00117 |
| <a name="l00118"></a><a class="code" href="classdecaf_1_1util_1_1_linked_list.html#ae734805be03705cfa77277fdc18fe2f3">00118</a> <span class="keyword">virtual</span> <a class="code" href="classdecaf_1_1util_1_1_linked_list.html#ae734805be03705cfa77277fdc18fe2f3">~LinkedList</a>() { |
| <a name="l00119"></a>00119 <span class="keywordflow">try</span>{ |
| <a name="l00120"></a>00120 this->purgeList(); |
| <a name="l00121"></a>00121 } <span class="keywordflow">catch</span>(...) {} |
| <a name="l00122"></a>00122 } |
| <a name="l00123"></a>00123 |
| <a name="l00124"></a>00124 <span class="keyword">public</span>: |
| <a name="l00125"></a>00125 |
| <a name="l00126"></a><a class="code" href="classdecaf_1_1util_1_1_linked_list.html#ae1732bd9aa9f31ad0fb44811cc55a150">00126</a> <a class="code" href="classdecaf_1_1util_1_1_linked_list.html" title="A complete implementation of the List interface using a doubly linked list data structure.">LinkedList<E></a>& <a class="code" href="classdecaf_1_1util_1_1_linked_list.html#ae1732bd9aa9f31ad0fb44811cc55a150">operator= </a>( <span class="keyword">const</span> <a class="code" href="classdecaf_1_1util_1_1_linked_list.html" title="A complete implementation of the List interface using a doubly linked list data structure.">LinkedList<E></a>& list ) { |
| <a name="l00127"></a>00127 this-><a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a28f3ac2ba58aaa4b62628d67c4a3776f" title="Removes all of the elements from this collection (optional operation).">clear</a>(); |
| <a name="l00128"></a>00128 this->addAllAtLocation( 0, list ); |
| <a name="l00129"></a>00129 <span class="keywordflow">return</span> *<span class="keyword">this</span>; |
| <a name="l00130"></a>00130 } |
| <a name="l00131"></a>00131 |
| <a name="l00132"></a><a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a8b218e487c21b8ee676955e6c3310a93">00132</a> <a class="code" href="classdecaf_1_1util_1_1_linked_list.html" title="A complete implementation of the List interface using a doubly linked list data structure.">LinkedList<E></a>& <a class="code" href="classdecaf_1_1util_1_1_linked_list.html#ae1732bd9aa9f31ad0fb44811cc55a150">operator= </a>( <span class="keyword">const</span> <a class="code" href="classdecaf_1_1util_1_1_collection.html" title="The root interface in the collection hierarchy.">Collection<E></a>& collection ) { |
| <a name="l00133"></a>00133 this-><a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a28f3ac2ba58aaa4b62628d67c4a3776f" title="Removes all of the elements from this collection (optional operation).">clear</a>(); |
| <a name="l00134"></a>00134 this->addAllAtLocation( 0, collection ); |
| <a name="l00135"></a>00135 <span class="keywordflow">return</span> *<span class="keyword">this</span>; |
| <a name="l00136"></a>00136 } |
| <a name="l00137"></a>00137 |
| <a name="l00138"></a>00138 <span class="keyword">public</span>: |
| <a name="l00139"></a>00139 |
| <a name="l00140"></a><a class="code" href="classdecaf_1_1util_1_1_linked_list.html#ac73db4c893a55d985bd437c80b7884e6">00140</a> <span class="keyword">virtual</span> E <span class="keyword">get</span>( <span class="keywordtype">int</span> index ) <span class="keyword">const</span> { |
| <a name="l00141"></a>00141 |
| <a name="l00142"></a>00142 <span class="keywordflow">if</span>( index < 0 || index >= this->listSize ) { |
| <a name="l00143"></a>00143 <span class="keywordflow">throw</span> <a class="code" href="classdecaf_1_1lang_1_1exceptions_1_1_index_out_of_bounds_exception.html">decaf::lang::exceptions::IndexOutOfBoundsException</a>( |
| <a name="l00144"></a>00144 __FILE__, __LINE__, <span class="stringliteral">"Index given is outside bounds of this list {%d}"</span>, index ); |
| <a name="l00145"></a>00145 } |
| <a name="l00146"></a>00146 |
| <a name="l00147"></a>00147 <span class="keyword">const</span> ListNode<E>* location = NULL; |
| <a name="l00148"></a>00148 |
| <a name="l00149"></a>00149 <span class="keywordflow">if</span>( index < this->listSize / 2 ) { |
| <a name="l00150"></a>00150 location = &this->head; |
| <a name="l00151"></a>00151 <span class="keywordflow">for</span>( <span class="keywordtype">int</span> i = 0; i <= index; ++i ) { |
| <a name="l00152"></a>00152 location = location->next; |
| <a name="l00153"></a>00153 } |
| <a name="l00154"></a>00154 } <span class="keywordflow">else</span> { |
| <a name="l00155"></a>00155 location = &this->tail; |
| <a name="l00156"></a>00156 <span class="keywordflow">for</span>( <span class="keywordtype">int</span> i = this->listSize; i > index; --i ) { |
| <a name="l00157"></a>00157 location = location->prev; |
| <a name="l00158"></a>00158 } |
| <a name="l00159"></a>00159 } |
| <a name="l00160"></a>00160 |
| <a name="l00161"></a>00161 <span class="keywordflow">return</span> location->value; |
| <a name="l00162"></a>00162 } |
| <a name="l00163"></a>00163 |
| <a name="l00164"></a><a class="code" href="classdecaf_1_1util_1_1_linked_list.html#ab4afe2aced7330f27c3f19494bec4004">00164</a> <span class="keyword">virtual</span> E <span class="keyword">set</span>( <span class="keywordtype">int</span> index, <span class="keyword">const</span> E& <a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a95572f23ee06ec83b6d46b7c4a6d943c" title="Gets but not removes the element in the head of the queue.">element</a> ) { |
| <a name="l00165"></a>00165 |
| <a name="l00166"></a>00166 <span class="keywordflow">if</span>( index < 0 || index >= this->listSize ) { |
| <a name="l00167"></a>00167 <span class="keywordflow">throw</span> <a class="code" href="classdecaf_1_1lang_1_1exceptions_1_1_index_out_of_bounds_exception.html">decaf::lang::exceptions::IndexOutOfBoundsException</a>( |
| <a name="l00168"></a>00168 __FILE__, __LINE__, <span class="stringliteral">"Index given is outside bounds of this list {%d}"</span>, index ); |
| <a name="l00169"></a>00169 } |
| <a name="l00170"></a>00170 |
| <a name="l00171"></a>00171 ListNode<E>* location = NULL; |
| <a name="l00172"></a>00172 |
| <a name="l00173"></a>00173 <span class="keywordflow">if</span>( index < this->listSize / 2 ) { |
| <a name="l00174"></a>00174 location = &this->head; |
| <a name="l00175"></a>00175 <span class="keywordflow">for</span>( <span class="keywordtype">int</span> i = 0; i <= index; ++i ) { |
| <a name="l00176"></a>00176 location = location->next; |
| <a name="l00177"></a>00177 } |
| <a name="l00178"></a>00178 } <span class="keywordflow">else</span> { |
| <a name="l00179"></a>00179 location = &this->tail; |
| <a name="l00180"></a>00180 <span class="keywordflow">for</span>( <span class="keywordtype">int</span> i = this->listSize; i > index; --i ) { |
| <a name="l00181"></a>00181 location = location->prev; |
| <a name="l00182"></a>00182 } |
| <a name="l00183"></a>00183 } |
| <a name="l00184"></a>00184 |
| <a name="l00185"></a>00185 E oldValue = location->value; |
| <a name="l00186"></a>00186 location->value = <a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a95572f23ee06ec83b6d46b7c4a6d943c" title="Gets but not removes the element in the head of the queue.">element</a>; |
| <a name="l00187"></a>00187 |
| <a name="l00188"></a>00188 <span class="keywordflow">return</span> oldValue; |
| <a name="l00189"></a>00189 } |
| <a name="l00190"></a>00190 |
| <a name="l00191"></a><a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a39885ef841dcabac211703c8a59bdbb8">00191</a> <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a39885ef841dcabac211703c8a59bdbb8" title="Returns true if this collection changed as a result of the call.">add</a>( <span class="keyword">const</span> E& value ) { |
| <a name="l00192"></a>00192 this->addToEnd( value ); |
| <a name="l00193"></a>00193 <span class="keywordflow">return</span> <span class="keyword">true</span>; |
| <a name="l00194"></a>00194 } |
| <a name="l00195"></a>00195 |
| <a name="l00196"></a><a class="code" href="classdecaf_1_1util_1_1_linked_list.html#ae9e821512524b28c93299fcde21942a5">00196</a> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classdecaf_1_1util_1_1_linked_list.html#ae9e821512524b28c93299fcde21942a5" title="Inserts the specified element at the specified position in this list.Shifts the element currently at ...">add</a>( <span class="keywordtype">int</span> index, <span class="keyword">const</span> E& value ) { |
| <a name="l00197"></a>00197 |
| <a name="l00198"></a>00198 <span class="keywordflow">if</span>( index < 0 || index > this->listSize ) { |
| <a name="l00199"></a>00199 <span class="keywordflow">throw</span> <a class="code" href="classdecaf_1_1lang_1_1exceptions_1_1_index_out_of_bounds_exception.html">decaf::lang::exceptions::IndexOutOfBoundsException</a>( |
| <a name="l00200"></a>00200 __FILE__, __LINE__, <span class="stringliteral">"Index given is outside bounds of this list {%d}"</span>, index ); |
| <a name="l00201"></a>00201 } |
| <a name="l00202"></a>00202 |
| <a name="l00203"></a>00203 this->addAtLocation( index, value ); |
| <a name="l00204"></a>00204 } |
| <a name="l00205"></a>00205 |
| <a name="l00206"></a><a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a4a74a58035384c176476fa6d86e110ad">00206</a> <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a4a74a58035384c176476fa6d86e110ad" title="Adds all of the elements in the specified collection to this collection.The behavior of this operatio...">addAll</a>( <span class="keyword">const</span> <a class="code" href="classdecaf_1_1util_1_1_collection.html" title="The root interface in the collection hierarchy.">Collection<E></a>& collection ) { |
| <a name="l00207"></a>00207 <span class="keywordflow">return</span> this->addAllAtLocation( this->listSize, collection ); |
| <a name="l00208"></a>00208 } |
| <a name="l00209"></a>00209 |
| <a name="l00210"></a><a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a02185504a9933efd07f996c35c65ee15">00210</a> <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a02185504a9933efd07f996c35c65ee15" title="Inserts all of the elements in the specified collection into this list at the specified position (opt...">addAll</a>( <span class="keywordtype">int</span> index, <span class="keyword">const</span> <a class="code" href="classdecaf_1_1util_1_1_collection.html" title="The root interface in the collection hierarchy.">Collection<E></a>& collection ) { |
| <a name="l00211"></a>00211 <span class="keywordflow">return</span> this->addAllAtLocation( index, collection ); |
| <a name="l00212"></a>00212 } |
| <a name="l00213"></a>00213 |
| <a name="l00214"></a><a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a3c96177b1a2b1df1b35bb4f1331f4930">00214</a> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a3c96177b1a2b1df1b35bb4f1331f4930" title="Renders this Collection as a Copy of the given Collection.">copy</a>( <span class="keyword">const</span> <a class="code" href="classdecaf_1_1util_1_1_collection.html" title="The root interface in the collection hierarchy.">Collection<E></a>& collection ) { |
| <a name="l00215"></a>00215 this-><a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a28f3ac2ba58aaa4b62628d67c4a3776f" title="Removes all of the elements from this collection (optional operation).">clear</a>(); |
| <a name="l00216"></a>00216 this->addAllAtLocation( 0, collection ); |
| <a name="l00217"></a>00217 } |
| <a name="l00218"></a>00218 |
| <a name="l00219"></a><a class="code" href="classdecaf_1_1util_1_1_linked_list.html#afef6159a30f8d5f5925b3200c5084a61">00219</a> <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <span class="keyword">remove</span>( <span class="keyword">const</span> E& value ) { |
| <a name="l00220"></a>00220 <span class="keywordflow">return</span> this-><a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a6ef53e4e255e67c612da97fb622759f9" title="Removes the first occurrence of the specified element from this Deque.">removeFirstOccurrence</a>( value ); |
| <a name="l00221"></a>00221 } |
| <a name="l00222"></a>00222 |
| <a name="l00223"></a><a class="code" href="classdecaf_1_1util_1_1_linked_list.html#abdc7b02d997f75a4c196c8661820859c">00223</a> <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classdecaf_1_1util_1_1_linked_list.html#abdc7b02d997f75a4c196c8661820859c" title="Returns true if this collection contains no elements.">isEmpty</a>()<span class="keyword"> const </span>{ |
| <a name="l00224"></a>00224 <span class="keywordflow">return</span> this->listSize == 0; |
| <a name="l00225"></a>00225 } |
| <a name="l00226"></a>00226 |
| <a name="l00227"></a><a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a66ce5415e8282db714226f5befadbc42">00227</a> <span class="keyword">virtual</span> <span class="keywordtype">int</span> <a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a66ce5415e8282db714226f5befadbc42" title="Returns the number of elements in this collection.">size</a>()<span class="keyword"> const </span>{ |
| <a name="l00228"></a>00228 <span class="keywordflow">return</span> this->listSize; |
| <a name="l00229"></a>00229 } |
| <a name="l00230"></a>00230 |
| <a name="l00231"></a><a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a28f3ac2ba58aaa4b62628d67c4a3776f">00231</a> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a28f3ac2ba58aaa4b62628d67c4a3776f" title="Removes all of the elements from this collection (optional operation).">clear</a>() { |
| <a name="l00232"></a>00232 this->purgeList(); |
| <a name="l00233"></a>00233 this->head.next = &this->tail; |
| <a name="l00234"></a>00234 this->tail.prev = &this->head; |
| <a name="l00235"></a>00235 this->listSize = 0; |
| <a name="l00236"></a>00236 <a class="code" href="classdecaf_1_1util_1_1_abstract_list.html" title="This class provides a skeletal implementation of the List interface to minimize the effort required t...">AbstractList<E>::modCount</a>++; |
| <a name="l00237"></a>00237 } |
| <a name="l00238"></a>00238 |
| <a name="l00239"></a><a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a8ab6b2bcc1521a9e97f7be6bab54ac1f">00239</a> <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a8ab6b2bcc1521a9e97f7be6bab54ac1f" title="Returns true if this collection contains the specified element.More formally, returns true if and onl...">contains</a>( <span class="keyword">const</span> E& value )<span class="keyword"> const </span>{ |
| <a name="l00240"></a>00240 <span class="keywordflow">return</span> this-><a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a6d6b658b978f39a10dc2c2d816ebf82e" title="Returns the index of the first occurrence of the specified element in this list, or -1 if this list d...">indexOf</a>( value ) != -1; |
| <a name="l00241"></a>00241 } |
| <a name="l00242"></a>00242 |
| <a name="l00243"></a><a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a6d6b658b978f39a10dc2c2d816ebf82e">00243</a> <span class="keyword">virtual</span> <span class="keywordtype">int</span> <a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a6d6b658b978f39a10dc2c2d816ebf82e" title="Returns the index of the first occurrence of the specified element in this list, or -1 if this list d...">indexOf</a>( <span class="keyword">const</span> E& value )<span class="keyword"> const </span>{ |
| <a name="l00244"></a>00244 |
| <a name="l00245"></a>00245 <span class="keywordflow">if</span>( this->listSize == 0 ) { |
| <a name="l00246"></a>00246 <span class="keywordflow">return</span> -1; |
| <a name="l00247"></a>00247 } |
| <a name="l00248"></a>00248 |
| <a name="l00249"></a>00249 <span class="keyword">const</span> ListNode<E>* location = this->head.next; |
| <a name="l00250"></a>00250 |
| <a name="l00251"></a>00251 <span class="keywordflow">for</span>( <span class="keywordtype">int</span> i = 0; location != &this->tail; ++i, location = location->next ) { |
| <a name="l00252"></a>00252 <span class="keywordflow">if</span>( location->value == value ) { |
| <a name="l00253"></a>00253 <span class="keywordflow">return</span> i; |
| <a name="l00254"></a>00254 } |
| <a name="l00255"></a>00255 } |
| <a name="l00256"></a>00256 |
| <a name="l00257"></a>00257 <span class="keywordflow">return</span> -1; |
| <a name="l00258"></a>00258 } |
| <a name="l00259"></a>00259 |
| <a name="l00260"></a><a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a63b6dcd80d7fd2dc940fcdfca38a6658">00260</a> <span class="keyword">virtual</span> <span class="keywordtype">int</span> <a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a63b6dcd80d7fd2dc940fcdfca38a6658" title="Returns the index of the last occurrence of the specified element in this list, or -1 if this list do...">lastIndexOf</a>( <span class="keyword">const</span> E& value )<span class="keyword"> const </span>{ |
| <a name="l00261"></a>00261 |
| <a name="l00262"></a>00262 <span class="keywordflow">if</span>( this->listSize == 0 ) { |
| <a name="l00263"></a>00263 <span class="keywordflow">return</span> -1; |
| <a name="l00264"></a>00264 } |
| <a name="l00265"></a>00265 |
| <a name="l00266"></a>00266 <span class="keyword">const</span> ListNode<E>* location = this->tail.prev; |
| <a name="l00267"></a>00267 |
| <a name="l00268"></a>00268 <span class="keywordflow">for</span>( <span class="keywordtype">int</span> i = this->listSize - 1; location != &this->head; --i, location = location->prev ) { |
| <a name="l00269"></a>00269 <span class="keywordflow">if</span>( location->value == value ) { |
| <a name="l00270"></a>00270 <span class="keywordflow">return</span> i; |
| <a name="l00271"></a>00271 } |
| <a name="l00272"></a>00272 } |
| <a name="l00273"></a>00273 |
| <a name="l00274"></a>00274 <span class="keywordflow">return</span> -1; |
| <a name="l00275"></a>00275 } |
| <a name="l00276"></a>00276 |
| <a name="l00277"></a><a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a949ed4ef7efac2e3bbbdbb3ea0e40f19">00277</a> <span class="keyword">virtual</span> std::vector<E> <a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a949ed4ef7efac2e3bbbdbb3ea0e40f19" title="Answers an STL vector containing copies of all elements contained in this Collection.">toArray</a>()<span class="keyword"> const </span>{ |
| <a name="l00278"></a>00278 |
| <a name="l00279"></a>00279 std::vector<E> result; |
| <a name="l00280"></a>00280 result.reserve( this->listSize ); |
| <a name="l00281"></a>00281 |
| <a name="l00282"></a>00282 <span class="keyword">const</span> ListNode<E>* current = this->head.next; |
| <a name="l00283"></a>00283 |
| <a name="l00284"></a>00284 <span class="keywordflow">while</span>( current != &this->tail ) { |
| <a name="l00285"></a>00285 result.push_back( current->value ); |
| <a name="l00286"></a>00286 current = current->next; |
| <a name="l00287"></a>00287 } |
| <a name="l00288"></a>00288 |
| <a name="l00289"></a>00289 <span class="keywordflow">return</span> result; |
| <a name="l00290"></a>00290 } |
| <a name="l00291"></a>00291 |
| <a name="l00292"></a>00292 <span class="keyword">public</span>: <span class="comment">// Deque interface implementation.</span> |
| <a name="l00293"></a>00293 |
| <a name="l00294"></a><a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a54f4a3b0e5238b9cba223a3674bbc91c">00294</a> <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a54f4a3b0e5238b9cba223a3674bbc91c" title="Inserts the specified element into the queue provided that the condition allows such an operation...">offer</a>( <span class="keyword">const</span> E& value ) { |
| <a name="l00295"></a>00295 this-><a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a92d0cc97928b07da8f57669d93e48870" title="Inserts an element onto the end of the Deque if possible without violating the implementations capaci...">addLast</a>( value ); |
| <a name="l00296"></a>00296 <span class="keywordflow">return</span> <span class="keyword">true</span>; |
| <a name="l00297"></a>00297 } |
| <a name="l00298"></a>00298 |
| <a name="l00299"></a><a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a6536badb6907b0f361ffc24ee6a9fb91">00299</a> <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a6536badb6907b0f361ffc24ee6a9fb91" title="Gets and removes the element in the head of the queue.">poll</a>( E& result ) { |
| <a name="l00300"></a>00300 |
| <a name="l00301"></a>00301 <span class="keywordflow">if</span>( this->listSize == 0 ) { |
| <a name="l00302"></a>00302 <span class="keywordflow">return</span> <span class="keyword">false</span>; |
| <a name="l00303"></a>00303 } |
| <a name="l00304"></a>00304 |
| <a name="l00305"></a>00305 result = this->head.next->value; |
| <a name="l00306"></a>00306 this->removeAtFront(); |
| <a name="l00307"></a>00307 <span class="keywordflow">return</span> <span class="keyword">true</span>; |
| <a name="l00308"></a>00308 } |
| <a name="l00309"></a>00309 |
| <a name="l00310"></a><a class="code" href="classdecaf_1_1util_1_1_linked_list.html#aadd28f2de45ba0789cd086eb5cfa3b20">00310</a> <span class="keyword">virtual</span> E <span class="keyword">remove</span>() { |
| <a name="l00311"></a>00311 <span class="keywordflow">return</span> this->removeAtFront(); |
| <a name="l00312"></a>00312 } |
| <a name="l00313"></a>00313 |
| <a name="l00314"></a><a class="code" href="classdecaf_1_1util_1_1_linked_list.html#aed721485edc2db03aac813cca8d04464">00314</a> <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classdecaf_1_1util_1_1_linked_list.html#aed721485edc2db03aac813cca8d04464" title="Gets but not removes the element in the head of the queue.">peek</a>( E& result )<span class="keyword"> const </span>{ |
| <a name="l00315"></a>00315 |
| <a name="l00316"></a>00316 <span class="keywordflow">if</span>( this->listSize == 0 ) { |
| <a name="l00317"></a>00317 <span class="keywordflow">return</span> <span class="keyword">false</span>; |
| <a name="l00318"></a>00318 } |
| <a name="l00319"></a>00319 |
| <a name="l00320"></a>00320 result = this->head.next->value; |
| <a name="l00321"></a>00321 <span class="keywordflow">return</span> <span class="keyword">true</span>; |
| <a name="l00322"></a>00322 } |
| <a name="l00323"></a>00323 |
| <a name="l00324"></a><a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a95572f23ee06ec83b6d46b7c4a6d943c">00324</a> <span class="keyword">virtual</span> E <a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a95572f23ee06ec83b6d46b7c4a6d943c" title="Gets but not removes the element in the head of the queue.">element</a>()<span class="keyword"> const </span>{ |
| <a name="l00325"></a>00325 <span class="keywordflow">if</span>( this->listSize == 0 ) { |
| <a name="l00326"></a>00326 <span class="keywordflow">throw</span> <a class="code" href="classdecaf_1_1util_1_1_no_such_element_exception.html">decaf::util::NoSuchElementException</a>( |
| <a name="l00327"></a>00327 __FILE__, __LINE__, <span class="stringliteral">"The list is Empty"</span> ); |
| <a name="l00328"></a>00328 } |
| <a name="l00329"></a>00329 |
| <a name="l00330"></a>00330 <span class="keywordflow">return</span> this->head.next->value; |
| <a name="l00331"></a>00331 } |
| <a name="l00332"></a>00332 |
| <a name="l00333"></a><a class="code" href="classdecaf_1_1util_1_1_linked_list.html#aa5f01f45b6b62f68e751d6a87b0fc93b">00333</a> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classdecaf_1_1util_1_1_linked_list.html#aa5f01f45b6b62f68e751d6a87b0fc93b" title="Inserts an element onto the front of the Deque if possible without violating the implementations capa...">addFirst</a>( <span class="keyword">const</span> E& value ) { |
| <a name="l00334"></a>00334 this->addToFront( value ); |
| <a name="l00335"></a>00335 } |
| <a name="l00336"></a>00336 |
| <a name="l00337"></a><a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a92d0cc97928b07da8f57669d93e48870">00337</a> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a92d0cc97928b07da8f57669d93e48870" title="Inserts an element onto the end of the Deque if possible without violating the implementations capaci...">addLast</a>( <span class="keyword">const</span> E& value ) { |
| <a name="l00338"></a>00338 this->addToEnd( value ); |
| <a name="l00339"></a>00339 } |
| <a name="l00340"></a>00340 |
| <a name="l00341"></a><a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a1e288af9be95667b036938357c19a789">00341</a> <span class="keyword">virtual</span> E& <a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a1e288af9be95667b036938357c19a789" title="Attempts to fetch a reference to the first element in the Deque.">getFirst</a>() { |
| <a name="l00342"></a>00342 <span class="keywordflow">if</span>( this->listSize == 0 ) { |
| <a name="l00343"></a>00343 <span class="keywordflow">throw</span> <a class="code" href="classdecaf_1_1util_1_1_no_such_element_exception.html">decaf::util::NoSuchElementException</a>( |
| <a name="l00344"></a>00344 __FILE__, __LINE__, <span class="stringliteral">"The list is Empty"</span> ); |
| <a name="l00345"></a>00345 } |
| <a name="l00346"></a>00346 |
| <a name="l00347"></a>00347 <span class="keywordflow">return</span> this->head.next->value; |
| <a name="l00348"></a>00348 } |
| <a name="l00349"></a>00349 |
| <a name="l00350"></a><a class="code" href="classdecaf_1_1util_1_1_linked_list.html#af4cb4e2a907f6ae9938f72df7e905d58">00350</a> <span class="keyword">virtual</span> <span class="keyword">const</span> E& <a class="code" href="classdecaf_1_1util_1_1_linked_list.html#af4cb4e2a907f6ae9938f72df7e905d58">getFirst</a>()<span class="keyword"> const </span>{ |
| <a name="l00351"></a>00351 <span class="keywordflow">if</span>( this->listSize == 0 ) { |
| <a name="l00352"></a>00352 <span class="keywordflow">throw</span> <a class="code" href="classdecaf_1_1util_1_1_no_such_element_exception.html">decaf::util::NoSuchElementException</a>( |
| <a name="l00353"></a>00353 __FILE__, __LINE__, <span class="stringliteral">"The list is Empty"</span> ); |
| <a name="l00354"></a>00354 } |
| <a name="l00355"></a>00355 |
| <a name="l00356"></a>00356 <span class="keywordflow">return</span> this->head.next->value; |
| <a name="l00357"></a>00357 } |
| <a name="l00358"></a>00358 |
| <a name="l00359"></a><a class="code" href="classdecaf_1_1util_1_1_linked_list.html#aba565fa6161925ad3986f7f97cb60318">00359</a> <span class="keyword">virtual</span> E& <a class="code" href="classdecaf_1_1util_1_1_linked_list.html#aba565fa6161925ad3986f7f97cb60318" title="Attempts to fetch a reference to the last element in the Deque.">getLast</a>() { |
| <a name="l00360"></a>00360 <span class="keywordflow">if</span>( this->listSize == 0 ) { |
| <a name="l00361"></a>00361 <span class="keywordflow">throw</span> <a class="code" href="classdecaf_1_1util_1_1_no_such_element_exception.html">decaf::util::NoSuchElementException</a>( |
| <a name="l00362"></a>00362 __FILE__, __LINE__, <span class="stringliteral">"The list is Empty"</span> ); |
| <a name="l00363"></a>00363 } |
| <a name="l00364"></a>00364 |
| <a name="l00365"></a>00365 <span class="keywordflow">return</span> this->tail.prev->value; |
| <a name="l00366"></a>00366 } |
| <a name="l00367"></a>00367 |
| <a name="l00368"></a><a class="code" href="classdecaf_1_1util_1_1_linked_list.html#ad5a8609c0e02bbb74d0a0807b9a01cdd">00368</a> <span class="keyword">virtual</span> <span class="keyword">const</span> E& <a class="code" href="classdecaf_1_1util_1_1_linked_list.html#ad5a8609c0e02bbb74d0a0807b9a01cdd">getLast</a>()<span class="keyword"> const </span>{ |
| <a name="l00369"></a>00369 <span class="keywordflow">if</span>( this->listSize == 0 ) { |
| <a name="l00370"></a>00370 <span class="keywordflow">throw</span> <a class="code" href="classdecaf_1_1util_1_1_no_such_element_exception.html">decaf::util::NoSuchElementException</a>( |
| <a name="l00371"></a>00371 __FILE__, __LINE__, <span class="stringliteral">"The list is Empty"</span> ); |
| <a name="l00372"></a>00372 } |
| <a name="l00373"></a>00373 |
| <a name="l00374"></a>00374 <span class="keywordflow">return</span> this->tail.prev->value; |
| <a name="l00375"></a>00375 } |
| <a name="l00376"></a>00376 |
| <a name="l00377"></a><a class="code" href="classdecaf_1_1util_1_1_linked_list.html#aada8d4242dfe1940393701b9a1863e4b">00377</a> <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classdecaf_1_1util_1_1_linked_list.html#aada8d4242dfe1940393701b9a1863e4b" title="This method attempts to insert the given element into the Deque at the front end.">offerFirst</a>( <span class="keyword">const</span> E& <a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a95572f23ee06ec83b6d46b7c4a6d943c" title="Gets but not removes the element in the head of the queue.">element</a> ) { |
| <a name="l00378"></a>00378 this->addToFront( element ); |
| <a name="l00379"></a>00379 <span class="keywordflow">return</span> <span class="keyword">true</span>; |
| <a name="l00380"></a>00380 } |
| <a name="l00381"></a>00381 |
| <a name="l00382"></a><a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a96e6784ab52573e053e66c9de16763c4">00382</a> <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a96e6784ab52573e053e66c9de16763c4" title="This method attempts to insert the given element into the Deque at the end.">offerLast</a>( <span class="keyword">const</span> E& <a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a95572f23ee06ec83b6d46b7c4a6d943c" title="Gets but not removes the element in the head of the queue.">element</a> ) { |
| <a name="l00383"></a>00383 this->addToEnd( element ); |
| <a name="l00384"></a>00384 <span class="keywordflow">return</span> <span class="keyword">true</span>; |
| <a name="l00385"></a>00385 } |
| <a name="l00386"></a>00386 |
| <a name="l00387"></a><a class="code" href="classdecaf_1_1util_1_1_linked_list.html#ac0092b2fe04b0abc434ffb403edfa41a">00387</a> <span class="keyword">virtual</span> E <a class="code" href="classdecaf_1_1util_1_1_linked_list.html#ac0092b2fe04b0abc434ffb403edfa41a" title="Removes the topmost element from the Deque and returns it.">removeFirst</a>() { |
| <a name="l00388"></a>00388 <span class="keywordflow">return</span> this->removeAtFront(); |
| <a name="l00389"></a>00389 } |
| <a name="l00390"></a>00390 |
| <a name="l00391"></a><a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a159dbaa72ec673ba5b5e666417e39675">00391</a> <span class="keyword">virtual</span> E <a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a159dbaa72ec673ba5b5e666417e39675" title="Removes the last element from the Deque and returns it.">removeLast</a>() { |
| <a name="l00392"></a>00392 <span class="keywordflow">return</span> this->removeAtEnd(); |
| <a name="l00393"></a>00393 } |
| <a name="l00394"></a>00394 |
| <a name="l00395"></a><a class="code" href="classdecaf_1_1util_1_1_linked_list.html#ad9cd206903dc14d47a586646bbae7ec2">00395</a> <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classdecaf_1_1util_1_1_linked_list.html#ad9cd206903dc14d47a586646bbae7ec2" title="Removes the first element from the Deque assigns it to the element reference passed.">pollFirst</a>( E& result ) { |
| <a name="l00396"></a>00396 <span class="keywordflow">if</span>( this->listSize == 0 ) { |
| <a name="l00397"></a>00397 <span class="keywordflow">return</span> <span class="keyword">false</span>; |
| <a name="l00398"></a>00398 } |
| <a name="l00399"></a>00399 |
| <a name="l00400"></a>00400 result = this->head.next->value; |
| <a name="l00401"></a>00401 this->removeAtFront(); |
| <a name="l00402"></a>00402 <span class="keywordflow">return</span> <span class="keyword">true</span>; |
| <a name="l00403"></a>00403 } |
| <a name="l00404"></a>00404 |
| <a name="l00405"></a><a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a7479a84c4cc91396fe8f5440a944e70d">00405</a> <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a7479a84c4cc91396fe8f5440a944e70d" title="Removes the last element from the Deque assigns it to the element reference passed.">pollLast</a>( E& result ) { |
| <a name="l00406"></a>00406 <span class="keywordflow">if</span>( this->listSize == 0 ) { |
| <a name="l00407"></a>00407 <span class="keywordflow">return</span> <span class="keyword">false</span>; |
| <a name="l00408"></a>00408 } |
| <a name="l00409"></a>00409 |
| <a name="l00410"></a>00410 result = this->tail.prev->value; |
| <a name="l00411"></a>00411 this->removeAtEnd(); |
| <a name="l00412"></a>00412 <span class="keywordflow">return</span> <span class="keyword">true</span>; |
| <a name="l00413"></a>00413 } |
| <a name="l00414"></a>00414 |
| <a name="l00415"></a><a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a898752801e827f1f1f40c5151e7e46cf">00415</a> <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a898752801e827f1f1f40c5151e7e46cf" title="Retrieves the first element contained in this Deque and assigns its value to the reference value pass...">peekFirst</a>( E& result )<span class="keyword"> const </span>{ |
| <a name="l00416"></a>00416 <span class="keywordflow">if</span>( this->listSize == 0 ) { |
| <a name="l00417"></a>00417 <span class="keywordflow">return</span> <span class="keyword">false</span>; |
| <a name="l00418"></a>00418 } |
| <a name="l00419"></a>00419 |
| <a name="l00420"></a>00420 result = this->head.next->value; |
| <a name="l00421"></a>00421 <span class="keywordflow">return</span> <span class="keyword">true</span>; |
| <a name="l00422"></a>00422 } |
| <a name="l00423"></a>00423 |
| <a name="l00424"></a><a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a26da657c45d6bdc440392f516f461e20">00424</a> <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a26da657c45d6bdc440392f516f461e20" title="Retrieves the last element contained in this Deque and assigns its value to the reference value passe...">peekLast</a>( E& result )<span class="keyword"> const </span>{ |
| <a name="l00425"></a>00425 <span class="keywordflow">if</span>( this->listSize == 0 ) { |
| <a name="l00426"></a>00426 <span class="keywordflow">return</span> <span class="keyword">false</span>; |
| <a name="l00427"></a>00427 } |
| <a name="l00428"></a>00428 |
| <a name="l00429"></a>00429 result = this->tail.prev->value; |
| <a name="l00430"></a>00430 <span class="keywordflow">return</span> <span class="keyword">true</span>; |
| <a name="l00431"></a>00431 } |
| <a name="l00432"></a>00432 |
| <a name="l00433"></a><a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a4c0b7534460b7d146f64a8f50b2df292">00433</a> <span class="keyword">virtual</span> E <a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a4c0b7534460b7d146f64a8f50b2df292" title="Treats this Deque as a stack and attempts to pop an element off the top.">pop</a>() { |
| <a name="l00434"></a>00434 <span class="keywordflow">return</span> this->removeAtFront(); |
| <a name="l00435"></a>00435 } |
| <a name="l00436"></a>00436 |
| <a name="l00437"></a><a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a5b5affbfe797781c7aa9ba426fbb7d4c">00437</a> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a5b5affbfe797781c7aa9ba426fbb7d4c" title="Pushes an element onto the stack represented by this deque (in other words, at the head of this deque...">push</a>( <span class="keyword">const</span> E& <a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a95572f23ee06ec83b6d46b7c4a6d943c" title="Gets but not removes the element in the head of the queue.">element</a> ) { |
| <a name="l00438"></a>00438 this->addToFront( element ); |
| <a name="l00439"></a>00439 } |
| <a name="l00440"></a>00440 |
| <a name="l00441"></a><a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a6ef53e4e255e67c612da97fb622759f9">00441</a> <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a6ef53e4e255e67c612da97fb622759f9" title="Removes the first occurrence of the specified element from this Deque.">removeFirstOccurrence</a>( <span class="keyword">const</span> E& value ) { |
| <a name="l00442"></a>00442 std::auto_ptr< Iterator<E> > iter( this-><a class="code" href="classdecaf_1_1util_1_1_abstract_sequential_list.html#a58c9a4978c785e51c944427f1f0792c8">iterator</a>() ); |
| <a name="l00443"></a>00443 <span class="keywordflow">while</span>( iter->hasNext() ) { |
| <a name="l00444"></a>00444 <span class="keywordflow">if</span>( iter->next() == value ) { |
| <a name="l00445"></a>00445 iter->remove(); |
| <a name="l00446"></a>00446 <span class="keywordflow">return</span> <span class="keyword">true</span>; |
| <a name="l00447"></a>00447 } |
| <a name="l00448"></a>00448 } |
| <a name="l00449"></a>00449 |
| <a name="l00450"></a>00450 <span class="keywordflow">return</span> <span class="keyword">false</span>; |
| <a name="l00451"></a>00451 } |
| <a name="l00452"></a><a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a28c45deb45f475fedaa790e8b33e0916">00452</a> <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a28c45deb45f475fedaa790e8b33e0916" title="Removes the last occurrence of the specified element from this Deque.">removeLastOccurrence</a>( <span class="keyword">const</span> E& value ) { |
| <a name="l00453"></a>00453 std::auto_ptr< Iterator<E> > iter( this-><a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a5c8d1cd6c03e8cf1c6cdd3f41b431e10" title="Provides an Iterator over this Collection that traverses the element in reverse order.">descendingIterator</a>() ); |
| <a name="l00454"></a>00454 <span class="keywordflow">while</span>( iter->hasNext() ) { |
| <a name="l00455"></a>00455 <span class="keywordflow">if</span>( iter->next() == value ) { |
| <a name="l00456"></a>00456 iter->remove(); |
| <a name="l00457"></a>00457 <span class="keywordflow">return</span> <span class="keyword">true</span>; |
| <a name="l00458"></a>00458 } |
| <a name="l00459"></a>00459 } |
| <a name="l00460"></a>00460 |
| <a name="l00461"></a>00461 <span class="keywordflow">return</span> <span class="keyword">false</span>; |
| <a name="l00462"></a>00462 } |
| <a name="l00463"></a>00463 |
| <a name="l00464"></a>00464 <span class="keyword">private</span>: |
| <a name="l00465"></a>00465 |
| <a name="l00466"></a>00466 <span class="keyword">class </span>LinkedListIterator : <span class="keyword">public</span> <a class="code" href="classdecaf_1_1util_1_1_list_iterator.html" title="An iterator for lists that allows the programmer to traverse the list in either direction, modify the list during iteration, and obtain the iterator&#39;s current position in the list.">ListIterator</a><E> { |
| <a name="l00467"></a>00467 <span class="keyword">private</span>: |
| <a name="l00468"></a>00468 |
| <a name="l00469"></a>00469 <span class="keyword">mutable</span> <a class="code" href="classdecaf_1_1util_1_1_linked_list.html" title="A complete implementation of the List interface using a doubly linked list data structure.">LinkedList<E></a>* list; |
| <a name="l00470"></a>00470 ListNode<E>* current; |
| <a name="l00471"></a>00471 ListNode<E>* lastReturned; |
| <a name="l00472"></a>00472 <span class="keywordtype">int</span> index; |
| <a name="l00473"></a>00473 <span class="keywordtype">int</span> expectedModCount; |
| <a name="l00474"></a>00474 |
| <a name="l00475"></a>00475 <span class="keyword">private</span>: |
| <a name="l00476"></a>00476 |
| <a name="l00477"></a>00477 LinkedListIterator( <span class="keyword">const</span> LinkedListIterator& ); |
| <a name="l00478"></a>00478 LinkedListIterator <a class="code" href="classdecaf_1_1util_1_1_linked_list.html#ae1732bd9aa9f31ad0fb44811cc55a150">operator= </a>( <span class="keyword">const</span> LinkedListIterator& ); |
| <a name="l00479"></a>00479 |
| <a name="l00480"></a>00480 <span class="keyword">public</span>: |
| <a name="l00481"></a>00481 |
| <a name="l00482"></a>00482 LinkedListIterator( <a class="code" href="classdecaf_1_1util_1_1_linked_list.html" title="A complete implementation of the List interface using a doubly linked list data structure.">LinkedList<E></a>* list, <span class="keywordtype">int</span> index ) : |
| <a name="l00483"></a>00483 <a class="code" href="classdecaf_1_1util_1_1_list_iterator.html" title="An iterator for lists that allows the programmer to traverse the list in either direction, modify the list during iteration, and obtain the iterator&#39;s current position in the list.">ListIterator</a><E>(), list(list), current(NULL), lastReturned(NULL), index(-1), expectedModCount(0) { |
| <a name="l00484"></a>00484 |
| <a name="l00485"></a>00485 <span class="keywordflow">if</span>( list == NULL ) { |
| <a name="l00486"></a>00486 <span class="keywordflow">throw</span> <a class="code" href="classdecaf_1_1lang_1_1exceptions_1_1_null_pointer_exception.html">decaf::lang::exceptions::NullPointerException</a>( |
| <a name="l00487"></a>00487 __FILE__, __LINE__, <span class="stringliteral">"Parent LinkedList pointer was Null."</span> ); |
| <a name="l00488"></a>00488 } |
| <a name="l00489"></a>00489 |
| <a name="l00490"></a>00490 <span class="keywordflow">if</span>( index < 0 || index > list->listSize ) { |
| <a name="l00491"></a>00491 <span class="keywordflow">throw</span> <a class="code" href="classdecaf_1_1lang_1_1exceptions_1_1_index_out_of_bounds_exception.html">decaf::lang::exceptions::IndexOutOfBoundsException</a>( |
| <a name="l00492"></a>00492 __FILE__, __LINE__, <span class="stringliteral">"Given index {%d} is out of range."</span>, index ); |
| <a name="l00493"></a>00493 } |
| <a name="l00494"></a>00494 |
| <a name="l00495"></a>00495 this->expectedModCount = list-><a class="code" href="classdecaf_1_1util_1_1_abstract_list.html#a7e28e12f1f7a4f1466030a45a3c04c14">modCount</a>; |
| <a name="l00496"></a>00496 |
| <a name="l00497"></a>00497 <span class="comment">// index starts at -1 to indicate that we are before begin or that the</span> |
| <a name="l00498"></a>00498 <span class="comment">// list is empty. We always want to start out one before so that the call</span> |
| <a name="l00499"></a>00499 <span class="comment">// to next moves us onto the element in question;</span> |
| <a name="l00500"></a>00500 |
| <a name="l00501"></a>00501 <span class="keywordflow">if</span>( index < this->list->listSize / 2 ) { |
| <a name="l00502"></a>00502 this->current = &this->list->head; |
| <a name="l00503"></a>00503 <span class="keywordflow">for</span>( this->index = -1; this->index + 1 < index; ++this->index ) { |
| <a name="l00504"></a>00504 this->current = this->current->next; |
| <a name="l00505"></a>00505 } |
| <a name="l00506"></a>00506 } <span class="keywordflow">else</span> { |
| <a name="l00507"></a>00507 this->current = &this->list->tail; |
| <a name="l00508"></a>00508 <span class="keywordflow">for</span>( this->index = this->list->listSize; this->index >= index; --this->index ) { |
| <a name="l00509"></a>00509 this->current = this->current->prev; |
| <a name="l00510"></a>00510 } |
| <a name="l00511"></a>00511 } |
| <a name="l00512"></a>00512 } |
| <a name="l00513"></a>00513 |
| <a name="l00514"></a>00514 <span class="keyword">virtual</span> ~LinkedListIterator() {} |
| <a name="l00515"></a>00515 |
| <a name="l00516"></a>00516 <span class="keyword">virtual</span> E next() { |
| <a name="l00517"></a>00517 |
| <a name="l00518"></a>00518 <span class="keywordflow">if</span>( this->expectedModCount != this->list-><a class="code" href="classdecaf_1_1util_1_1_abstract_list.html#a7e28e12f1f7a4f1466030a45a3c04c14">modCount</a> ) { |
| <a name="l00519"></a>00519 <span class="keywordflow">throw</span> ConcurrentModificationException( |
| <a name="l00520"></a>00520 __FILE__, __LINE__, <span class="stringliteral">"List modified outside of this Iterator."</span> ); |
| <a name="l00521"></a>00521 } |
| <a name="l00522"></a>00522 |
| <a name="l00523"></a>00523 <span class="keywordflow">if</span>( this->current->next == &(this->list->tail) ) { |
| <a name="l00524"></a>00524 <span class="keywordflow">throw</span> NoSuchElementException( |
| <a name="l00525"></a>00525 __FILE__, __LINE__, <span class="stringliteral">"No more elements to return from next()"</span> ); |
| <a name="l00526"></a>00526 } |
| <a name="l00527"></a>00527 |
| <a name="l00528"></a>00528 this->current = this->current->next; |
| <a name="l00529"></a>00529 this->lastReturned = this->current; |
| <a name="l00530"></a>00530 this->index++; |
| <a name="l00531"></a>00531 |
| <a name="l00532"></a>00532 <span class="keywordflow">return</span> this->current->value; |
| <a name="l00533"></a>00533 } |
| <a name="l00534"></a>00534 |
| <a name="l00535"></a>00535 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> hasNext()<span class="keyword"> const </span>{ |
| <a name="l00536"></a>00536 <span class="keywordflow">return</span> ( this->current->next != &(this->list->tail) ); |
| <a name="l00537"></a>00537 } |
| <a name="l00538"></a>00538 |
| <a name="l00539"></a>00539 |
| <a name="l00540"></a>00540 <span class="keyword">virtual</span> E previous() { |
| <a name="l00541"></a>00541 <span class="keywordflow">if</span>( this->expectedModCount != this->list-><a class="code" href="classdecaf_1_1util_1_1_abstract_list.html#a7e28e12f1f7a4f1466030a45a3c04c14">modCount</a> ) { |
| <a name="l00542"></a>00542 <span class="keywordflow">throw</span> ConcurrentModificationException( |
| <a name="l00543"></a>00543 __FILE__, __LINE__, <span class="stringliteral">"List modified outside of this Iterator."</span> ); |
| <a name="l00544"></a>00544 } |
| <a name="l00545"></a>00545 |
| <a name="l00546"></a>00546 <span class="keywordflow">if</span>( this->current == &(this->list->head) ) { |
| <a name="l00547"></a>00547 <span class="keywordflow">throw</span> <a class="code" href="classdecaf_1_1lang_1_1exceptions_1_1_illegal_state_exception.html">decaf::lang::exceptions::IllegalStateException</a>( |
| <a name="l00548"></a>00548 __FILE__, __LINE__, |
| <a name="l00549"></a>00549 <span class="stringliteral">"No previous element, must call next() before calling previous()."</span> ); |
| <a name="l00550"></a>00550 } |
| <a name="l00551"></a>00551 |
| <a name="l00552"></a>00552 this->lastReturned = this->current; |
| <a name="l00553"></a>00553 this->current = this->current->prev; |
| <a name="l00554"></a>00554 this->index--; |
| <a name="l00555"></a>00555 |
| <a name="l00556"></a>00556 <span class="keywordflow">return</span> this->lastReturned->value; |
| <a name="l00557"></a>00557 } |
| <a name="l00558"></a>00558 |
| <a name="l00559"></a>00559 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> hasPrevious()<span class="keyword"> const </span>{ |
| <a name="l00560"></a>00560 <span class="keywordflow">return</span> ( this->current != &(this->list->head) ); |
| <a name="l00561"></a>00561 } |
| <a name="l00562"></a>00562 |
| <a name="l00563"></a>00563 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <span class="keyword">remove</span>() { |
| <a name="l00564"></a>00564 <span class="keywordflow">if</span>( this->expectedModCount != this->list-><a class="code" href="classdecaf_1_1util_1_1_abstract_list.html#a7e28e12f1f7a4f1466030a45a3c04c14">modCount</a> ) { |
| <a name="l00565"></a>00565 <span class="keywordflow">throw</span> ConcurrentModificationException( |
| <a name="l00566"></a>00566 __FILE__, __LINE__, <span class="stringliteral">"List modified outside of this Iterator."</span> ); |
| <a name="l00567"></a>00567 } |
| <a name="l00568"></a>00568 |
| <a name="l00569"></a>00569 <span class="keywordflow">if</span>( this->lastReturned == NULL ) { |
| <a name="l00570"></a>00570 <span class="keywordflow">throw</span> lang::exceptions::IllegalStateException( |
| <a name="l00571"></a>00571 __FILE__, __LINE__, |
| <a name="l00572"></a>00572 <span class="stringliteral">"Invalid State to call remove, must call next() before remove()"</span> ); |
| <a name="l00573"></a>00573 } |
| <a name="l00574"></a>00574 |
| <a name="l00575"></a>00575 ListNode<E>* next = this->lastReturned->next; |
| <a name="l00576"></a>00576 ListNode<E>* previous = this->lastReturned->prev; |
| <a name="l00577"></a>00577 |
| <a name="l00578"></a>00578 next->prev = previous; |
| <a name="l00579"></a>00579 previous->next = next; |
| <a name="l00580"></a>00580 |
| <a name="l00581"></a>00581 <span class="comment">// When iterating in reverse this would not be true</span> |
| <a name="l00582"></a>00582 <span class="keywordflow">if</span>( this->current == this->lastReturned ) { |
| <a name="l00583"></a>00583 this->index--; |
| <a name="l00584"></a>00584 } |
| <a name="l00585"></a>00585 this->current = previous; |
| <a name="l00586"></a>00586 |
| <a name="l00587"></a>00587 <span class="keyword">delete</span> this->lastReturned; |
| <a name="l00588"></a>00588 this->lastReturned = NULL; |
| <a name="l00589"></a>00589 |
| <a name="l00590"></a>00590 this->list->listSize--; |
| <a name="l00591"></a>00591 this->list-><a class="code" href="classdecaf_1_1util_1_1_abstract_list.html#a7e28e12f1f7a4f1466030a45a3c04c14">modCount</a>++; |
| <a name="l00592"></a>00592 |
| <a name="l00593"></a>00593 this->expectedModCount++; |
| <a name="l00594"></a>00594 } |
| <a name="l00595"></a>00595 |
| <a name="l00596"></a>00596 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a39885ef841dcabac211703c8a59bdbb8" title="Returns true if this collection changed as a result of the call.">add</a>( <span class="keyword">const</span> E& e ) { |
| <a name="l00597"></a>00597 <span class="keywordflow">if</span>( this->expectedModCount != this->list-><a class="code" href="classdecaf_1_1util_1_1_abstract_list.html#a7e28e12f1f7a4f1466030a45a3c04c14">modCount</a> ) { |
| <a name="l00598"></a>00598 <span class="keywordflow">throw</span> ConcurrentModificationException( |
| <a name="l00599"></a>00599 __FILE__, __LINE__, <span class="stringliteral">"List modified outside of this Iterator."</span> ); |
| <a name="l00600"></a>00600 } |
| <a name="l00601"></a>00601 |
| <a name="l00602"></a>00602 ListNode<E>* newNode = <span class="keyword">new</span> ListNode<E>( this->current, this->current->next, e ); |
| <a name="l00603"></a>00603 |
| <a name="l00604"></a>00604 this->current->next->prev = newNode; |
| <a name="l00605"></a>00605 this->current->next = newNode; |
| <a name="l00606"></a>00606 |
| <a name="l00607"></a>00607 this->current = newNode; |
| <a name="l00608"></a>00608 this->lastReturned = NULL; |
| <a name="l00609"></a>00609 |
| <a name="l00610"></a>00610 this->index++; |
| <a name="l00611"></a>00611 this->expectedModCount++; |
| <a name="l00612"></a>00612 this->list-><a class="code" href="classdecaf_1_1util_1_1_abstract_list.html#a7e28e12f1f7a4f1466030a45a3c04c14">modCount</a>++; |
| <a name="l00613"></a>00613 this->list->listSize++; |
| <a name="l00614"></a>00614 } |
| <a name="l00615"></a>00615 |
| <a name="l00616"></a>00616 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <span class="keyword">set</span>( <span class="keyword">const</span> E& e ) { |
| <a name="l00617"></a>00617 |
| <a name="l00618"></a>00618 <span class="keywordflow">if</span>( this->expectedModCount != this->list-><a class="code" href="classdecaf_1_1util_1_1_abstract_list.html#a7e28e12f1f7a4f1466030a45a3c04c14">modCount</a> ) { |
| <a name="l00619"></a>00619 <span class="keywordflow">throw</span> ConcurrentModificationException( |
| <a name="l00620"></a>00620 __FILE__, __LINE__, <span class="stringliteral">"List modified outside of this Iterator."</span> ); |
| <a name="l00621"></a>00621 } |
| <a name="l00622"></a>00622 |
| <a name="l00623"></a>00623 <span class="keywordflow">if</span>( this->lastReturned != NULL ) { |
| <a name="l00624"></a>00624 this->lastReturned->value = e; |
| <a name="l00625"></a>00625 } <span class="keywordflow">else</span> { |
| <a name="l00626"></a>00626 <span class="keywordflow">throw</span> <a class="code" href="classdecaf_1_1lang_1_1exceptions_1_1_illegal_state_exception.html">decaf::lang::exceptions::IllegalStateException</a>( |
| <a name="l00627"></a>00627 __FILE__, __LINE__, <span class="stringliteral">"Iterator next has not been called."</span> ); |
| <a name="l00628"></a>00628 } |
| <a name="l00629"></a>00629 } |
| <a name="l00630"></a>00630 |
| <a name="l00631"></a>00631 <span class="keyword">virtual</span> <span class="keywordtype">int</span> nextIndex()<span class="keyword"> const </span>{ |
| <a name="l00632"></a>00632 <span class="keywordflow">return</span> this->index + 1; |
| <a name="l00633"></a>00633 } |
| <a name="l00634"></a>00634 |
| <a name="l00635"></a>00635 <span class="keyword">virtual</span> <span class="keywordtype">int</span> previousIndex()<span class="keyword"> const </span>{ |
| <a name="l00636"></a>00636 <span class="keywordflow">return</span> this->index; |
| <a name="l00637"></a>00637 } |
| <a name="l00638"></a>00638 }; |
| <a name="l00639"></a>00639 |
| <a name="l00640"></a>00640 <span class="keyword">class </span>ConstLinkedListIterator : <span class="keyword">public</span> ListIterator<E> { |
| <a name="l00641"></a>00641 <span class="keyword">private</span>: |
| <a name="l00642"></a>00642 |
| <a name="l00643"></a>00643 <span class="keyword">const</span> LinkedList<E>* list; |
| <a name="l00644"></a>00644 <span class="keyword">const</span> ListNode<E>* current; |
| <a name="l00645"></a>00645 <span class="keyword">const</span> ListNode<E>* lastReturned; |
| <a name="l00646"></a>00646 <span class="keywordtype">int</span> index; |
| <a name="l00647"></a>00647 |
| <a name="l00648"></a>00648 <span class="keyword">private</span>: |
| <a name="l00649"></a>00649 |
| <a name="l00650"></a>00650 ConstLinkedListIterator( <span class="keyword">const</span> ConstLinkedListIterator& ); |
| <a name="l00651"></a>00651 ConstLinkedListIterator <a class="code" href="classdecaf_1_1util_1_1_linked_list.html#ae1732bd9aa9f31ad0fb44811cc55a150">operator= </a>( <span class="keyword">const</span> ConstLinkedListIterator& ); |
| <a name="l00652"></a>00652 |
| <a name="l00653"></a>00653 <span class="keyword">public</span>: |
| <a name="l00654"></a>00654 |
| <a name="l00655"></a>00655 ConstLinkedListIterator( <span class="keyword">const</span> LinkedList<E>* list, <span class="keywordtype">int</span> index ) : |
| <a name="l00656"></a>00656 ListIterator<E>(), list(list), current(NULL), lastReturned(NULL), index(-1) { |
| <a name="l00657"></a>00657 |
| <a name="l00658"></a>00658 <span class="keywordflow">if</span>( list == NULL ) { |
| <a name="l00659"></a>00659 <span class="keywordflow">throw</span> <a class="code" href="classdecaf_1_1lang_1_1exceptions_1_1_null_pointer_exception.html">decaf::lang::exceptions::NullPointerException</a>( |
| <a name="l00660"></a>00660 __FILE__, __LINE__, <span class="stringliteral">"Parent LinkedList pointer was Null."</span> ); |
| <a name="l00661"></a>00661 } |
| <a name="l00662"></a>00662 |
| <a name="l00663"></a>00663 <span class="keywordflow">if</span>( index < 0 || index > list->listSize ) { |
| <a name="l00664"></a>00664 <span class="keywordflow">throw</span> <a class="code" href="classdecaf_1_1lang_1_1exceptions_1_1_index_out_of_bounds_exception.html">decaf::lang::exceptions::IndexOutOfBoundsException</a>( |
| <a name="l00665"></a>00665 __FILE__, __LINE__, <span class="stringliteral">"Given index {%d} is out of range."</span>, index ); |
| <a name="l00666"></a>00666 } |
| <a name="l00667"></a>00667 |
| <a name="l00668"></a>00668 <span class="comment">// index starts at -1 to indicate that we are before begin or that the</span> |
| <a name="l00669"></a>00669 <span class="comment">// list is empty. We always want to start out one before so that the call</span> |
| <a name="l00670"></a>00670 <span class="comment">// to next moves us onto the element in question;</span> |
| <a name="l00671"></a>00671 |
| <a name="l00672"></a>00672 <span class="keywordflow">if</span>( index < this->list->listSize / 2 ) { |
| <a name="l00673"></a>00673 this->current = &this->list->head; |
| <a name="l00674"></a>00674 <span class="keywordflow">for</span>( this->index = -1; this->index + 1 < index; ++this->index ) { |
| <a name="l00675"></a>00675 this->current = this->current->next; |
| <a name="l00676"></a>00676 } |
| <a name="l00677"></a>00677 } <span class="keywordflow">else</span> { |
| <a name="l00678"></a>00678 this->current = &this->list->tail; |
| <a name="l00679"></a>00679 <span class="keywordflow">for</span>( this->index = this->list->listSize; this->index >= index; --this->index ) { |
| <a name="l00680"></a>00680 this->current = this->current->prev; |
| <a name="l00681"></a>00681 } |
| <a name="l00682"></a>00682 } |
| <a name="l00683"></a>00683 } |
| <a name="l00684"></a>00684 |
| <a name="l00685"></a>00685 <span class="keyword">virtual</span> ~ConstLinkedListIterator() {} |
| <a name="l00686"></a>00686 |
| <a name="l00687"></a>00687 <span class="keyword">virtual</span> E next() { |
| <a name="l00688"></a>00688 |
| <a name="l00689"></a>00689 <span class="keywordflow">if</span>( this->current->next == &(this->list->tail) ) { |
| <a name="l00690"></a>00690 <span class="keywordflow">throw</span> NoSuchElementException( |
| <a name="l00691"></a>00691 __FILE__, __LINE__, <span class="stringliteral">"No more elements to return from this ListIterator"</span> ); |
| <a name="l00692"></a>00692 } |
| <a name="l00693"></a>00693 |
| <a name="l00694"></a>00694 this->current = this->current->next; |
| <a name="l00695"></a>00695 this->lastReturned = this->current; |
| <a name="l00696"></a>00696 this->index++; |
| <a name="l00697"></a>00697 |
| <a name="l00698"></a>00698 <span class="keywordflow">return</span> this->current->value; |
| <a name="l00699"></a>00699 } |
| <a name="l00700"></a>00700 |
| <a name="l00701"></a>00701 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> hasNext()<span class="keyword"> const </span>{ |
| <a name="l00702"></a>00702 <span class="keywordflow">return</span> ( this->current->next != &(this->list->tail) ); |
| <a name="l00703"></a>00703 } |
| <a name="l00704"></a>00704 |
| <a name="l00705"></a>00705 <span class="keyword">virtual</span> E previous() { |
| <a name="l00706"></a>00706 |
| <a name="l00707"></a>00707 <span class="keywordflow">if</span>( this->current == &(this->list->head) ) { |
| <a name="l00708"></a>00708 <span class="keywordflow">throw</span> <a class="code" href="classdecaf_1_1lang_1_1exceptions_1_1_illegal_state_exception.html">decaf::lang::exceptions::IllegalStateException</a>( |
| <a name="l00709"></a>00709 __FILE__, __LINE__, |
| <a name="l00710"></a>00710 <span class="stringliteral">"No previous element, must call next() before calling previous()."</span> ); |
| <a name="l00711"></a>00711 } |
| <a name="l00712"></a>00712 |
| <a name="l00713"></a>00713 this->lastReturned = this->current; |
| <a name="l00714"></a>00714 this->current = this->current->prev; |
| <a name="l00715"></a>00715 this->index--; |
| <a name="l00716"></a>00716 |
| <a name="l00717"></a>00717 <span class="keywordflow">return</span> this->lastReturned->value; |
| <a name="l00718"></a>00718 } |
| <a name="l00719"></a>00719 |
| <a name="l00720"></a>00720 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> hasPrevious()<span class="keyword"> const </span>{ |
| <a name="l00721"></a>00721 <span class="keywordflow">return</span> ( this->current != &(this->list->head) ); |
| <a name="l00722"></a>00722 } |
| <a name="l00723"></a>00723 |
| <a name="l00724"></a>00724 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <span class="keyword">remove</span>() { |
| <a name="l00725"></a>00725 <span class="keywordflow">throw</span> lang::exceptions::UnsupportedOperationException( |
| <a name="l00726"></a>00726 __FILE__, __LINE__, <span class="stringliteral">"Cannot write to a const ListIterator."</span> ); |
| <a name="l00727"></a>00727 } |
| <a name="l00728"></a>00728 |
| <a name="l00729"></a>00729 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a39885ef841dcabac211703c8a59bdbb8" title="Returns true if this collection changed as a result of the call.">add</a>( <span class="keyword">const</span> E& e <a class="code" href="decaf_2util_2_config_8h.html#a020140ce33d6a3287b0e98458aac2f3e">DECAF_UNUSED</a> ) { |
| <a name="l00730"></a>00730 <span class="keywordflow">throw</span> lang::exceptions::UnsupportedOperationException( |
| <a name="l00731"></a>00731 __FILE__, __LINE__, <span class="stringliteral">"Cannot write to a const ListIterator."</span> ); |
| <a name="l00732"></a>00732 } |
| <a name="l00733"></a>00733 |
| <a name="l00734"></a>00734 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <span class="keyword">set</span>( <span class="keyword">const</span> E& e <a class="code" href="decaf_2util_2_config_8h.html#a020140ce33d6a3287b0e98458aac2f3e">DECAF_UNUSED</a> ) { |
| <a name="l00735"></a>00735 <span class="keywordflow">throw</span> lang::exceptions::UnsupportedOperationException( |
| <a name="l00736"></a>00736 __FILE__, __LINE__, <span class="stringliteral">"Cannot write to a const ListIterator."</span> ); |
| <a name="l00737"></a>00737 } |
| <a name="l00738"></a>00738 |
| <a name="l00739"></a>00739 <span class="keyword">virtual</span> <span class="keywordtype">int</span> nextIndex()<span class="keyword"> const </span>{ |
| <a name="l00740"></a>00740 <span class="keywordflow">return</span> this->index + 1; |
| <a name="l00741"></a>00741 } |
| <a name="l00742"></a>00742 |
| <a name="l00743"></a>00743 <span class="keyword">virtual</span> <span class="keywordtype">int</span> previousIndex()<span class="keyword"> const </span>{ |
| <a name="l00744"></a>00744 <span class="keywordflow">return</span> this->index; |
| <a name="l00745"></a>00745 } |
| <a name="l00746"></a>00746 }; |
| <a name="l00747"></a>00747 |
| <a name="l00748"></a>00748 <span class="keyword">class </span>ReverseIterator : <span class="keyword">public</span> Iterator<E> { |
| <a name="l00749"></a>00749 <span class="keyword">private</span>: |
| <a name="l00750"></a>00750 |
| <a name="l00751"></a>00751 LinkedList<E>* list; |
| <a name="l00752"></a>00752 ListNode<E>* current; |
| <a name="l00753"></a>00753 <span class="keywordtype">int</span> expectedModCount; |
| <a name="l00754"></a>00754 <span class="keywordtype">bool</span> canRemove; |
| <a name="l00755"></a>00755 |
| <a name="l00756"></a>00756 <span class="keyword">private</span>: |
| <a name="l00757"></a>00757 |
| <a name="l00758"></a>00758 ReverseIterator( <span class="keyword">const</span> ReverseIterator& ); |
| <a name="l00759"></a>00759 ReverseIterator <a class="code" href="classdecaf_1_1util_1_1_linked_list.html#ae1732bd9aa9f31ad0fb44811cc55a150">operator= </a>( <span class="keyword">const</span> ReverseIterator& ); |
| <a name="l00760"></a>00760 |
| <a name="l00761"></a>00761 <span class="keyword">public</span>: |
| <a name="l00762"></a>00762 |
| <a name="l00763"></a>00763 ReverseIterator( LinkedList<E>* list ) : |
| <a name="l00764"></a>00764 Iterator<E>(), list( list ), current(NULL), expectedModCount(0), canRemove(false) { |
| <a name="l00765"></a>00765 |
| <a name="l00766"></a>00766 <span class="keywordflow">if</span>( list == NULL ) { |
| <a name="l00767"></a>00767 <span class="keywordflow">throw</span> <a class="code" href="classdecaf_1_1lang_1_1exceptions_1_1_null_pointer_exception.html">decaf::lang::exceptions::NullPointerException</a>( |
| <a name="l00768"></a>00768 __FILE__, __LINE__, <span class="stringliteral">"Parent LinkedList pointer was Null."</span> ); |
| <a name="l00769"></a>00769 } |
| <a name="l00770"></a>00770 |
| <a name="l00771"></a>00771 this->expectedModCount = this->list->modCount; |
| <a name="l00772"></a>00772 this->current = &list->tail; |
| <a name="l00773"></a>00773 } |
| <a name="l00774"></a>00774 |
| <a name="l00775"></a>00775 <span class="keyword">virtual</span> ~ReverseIterator() {} |
| <a name="l00776"></a>00776 |
| <a name="l00777"></a>00777 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> hasNext()<span class="keyword"> const </span>{ |
| <a name="l00778"></a>00778 <span class="keywordflow">return</span> this->current->prev != &(this->list->head); |
| <a name="l00779"></a>00779 } |
| <a name="l00780"></a>00780 |
| <a name="l00781"></a>00781 <span class="keyword">virtual</span> E next() { |
| <a name="l00782"></a>00782 |
| <a name="l00783"></a>00783 <span class="keywordflow">if</span>( this->expectedModCount != this->list->modCount ) { |
| <a name="l00784"></a>00784 <span class="keywordflow">throw</span> ConcurrentModificationException( |
| <a name="l00785"></a>00785 __FILE__, __LINE__, <span class="stringliteral">"List modified outside of this Iterator."</span> ); |
| <a name="l00786"></a>00786 } |
| <a name="l00787"></a>00787 |
| <a name="l00788"></a>00788 <span class="keywordflow">if</span>( this->current->prev == &(this->list->head) ) { |
| <a name="l00789"></a>00789 <span class="keywordflow">throw</span> NoSuchElementException( |
| <a name="l00790"></a>00790 __FILE__, __LINE__, <span class="stringliteral">"No more elements to return from next()"</span> ); |
| <a name="l00791"></a>00791 } |
| <a name="l00792"></a>00792 |
| <a name="l00793"></a>00793 this->current = this->current->prev; |
| <a name="l00794"></a>00794 this->canRemove = <span class="keyword">true</span>; |
| <a name="l00795"></a>00795 |
| <a name="l00796"></a>00796 <span class="keywordflow">return</span> this->current->value; |
| <a name="l00797"></a>00797 } |
| <a name="l00798"></a>00798 |
| <a name="l00799"></a>00799 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <span class="keyword">remove</span>() { |
| <a name="l00800"></a>00800 <span class="keywordflow">if</span>( this->expectedModCount != this->list->modCount ) { |
| <a name="l00801"></a>00801 <span class="keywordflow">throw</span> ConcurrentModificationException( |
| <a name="l00802"></a>00802 __FILE__, __LINE__, <span class="stringliteral">"List modified outside of this Iterator."</span> ); |
| <a name="l00803"></a>00803 } |
| <a name="l00804"></a>00804 |
| <a name="l00805"></a>00805 <span class="keywordflow">if</span>( !this->canRemove ) { |
| <a name="l00806"></a>00806 <span class="keywordflow">throw</span> lang::exceptions::IllegalStateException( |
| <a name="l00807"></a>00807 __FILE__, __LINE__, |
| <a name="l00808"></a>00808 <span class="stringliteral">"Invalid State to call remove, must call next() before remove()"</span> ); |
| <a name="l00809"></a>00809 } |
| <a name="l00810"></a>00810 |
| <a name="l00811"></a>00811 ListNode<E>* next = this->current->prev; |
| <a name="l00812"></a>00812 ListNode<E>* prev = this->current->next; |
| <a name="l00813"></a>00813 |
| <a name="l00814"></a>00814 next->next = prev; |
| <a name="l00815"></a>00815 prev->prev = next; |
| <a name="l00816"></a>00816 |
| <a name="l00817"></a>00817 <span class="keyword">delete</span> this->current; |
| <a name="l00818"></a>00818 |
| <a name="l00819"></a>00819 this->current = prev; |
| <a name="l00820"></a>00820 |
| <a name="l00821"></a>00821 this->list->listSize--; |
| <a name="l00822"></a>00822 this->list->modCount++; |
| <a name="l00823"></a>00823 this->expectedModCount++; |
| <a name="l00824"></a>00824 this->canRemove = <span class="keyword">false</span>; |
| <a name="l00825"></a>00825 } |
| <a name="l00826"></a>00826 }; |
| <a name="l00827"></a>00827 |
| <a name="l00828"></a>00828 <span class="keyword">class </span>ConstReverseIterator : <span class="keyword">public</span> Iterator<E> { |
| <a name="l00829"></a>00829 <span class="keyword">private</span>: |
| <a name="l00830"></a>00830 |
| <a name="l00831"></a>00831 <span class="keyword">const</span> LinkedList<E>* list; |
| <a name="l00832"></a>00832 <span class="keyword">const</span> ListNode<E>* current; |
| <a name="l00833"></a>00833 |
| <a name="l00834"></a>00834 <span class="keyword">private</span>: |
| <a name="l00835"></a>00835 |
| <a name="l00836"></a>00836 ConstReverseIterator( <span class="keyword">const</span> ConstReverseIterator& ); |
| <a name="l00837"></a>00837 ConstReverseIterator <a class="code" href="classdecaf_1_1util_1_1_linked_list.html#ae1732bd9aa9f31ad0fb44811cc55a150">operator= </a>( <span class="keyword">const</span> ConstReverseIterator& ); |
| <a name="l00838"></a>00838 |
| <a name="l00839"></a>00839 <span class="keyword">public</span>: |
| <a name="l00840"></a>00840 |
| <a name="l00841"></a>00841 ConstReverseIterator( <span class="keyword">const</span> LinkedList<E>* list ) : |
| <a name="l00842"></a>00842 Iterator<E>(), list( list ), current(NULL) { |
| <a name="l00843"></a>00843 |
| <a name="l00844"></a>00844 <span class="keywordflow">if</span>( list == NULL ) { |
| <a name="l00845"></a>00845 <span class="keywordflow">throw</span> <a class="code" href="classdecaf_1_1lang_1_1exceptions_1_1_null_pointer_exception.html">decaf::lang::exceptions::NullPointerException</a>( |
| <a name="l00846"></a>00846 __FILE__, __LINE__, <span class="stringliteral">"Parent LinkedList pointer was Null."</span> ); |
| <a name="l00847"></a>00847 } |
| <a name="l00848"></a>00848 |
| <a name="l00849"></a>00849 this->current = &list->tail; |
| <a name="l00850"></a>00850 } |
| <a name="l00851"></a>00851 |
| <a name="l00852"></a>00852 <span class="keyword">virtual</span> ~ConstReverseIterator() {} |
| <a name="l00853"></a>00853 |
| <a name="l00854"></a>00854 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> hasNext()<span class="keyword"> const </span>{ |
| <a name="l00855"></a>00855 <span class="keywordflow">return</span> this->current->prev != &(this->list->head); |
| <a name="l00856"></a>00856 } |
| <a name="l00857"></a>00857 |
| <a name="l00858"></a>00858 <span class="keyword">virtual</span> E next() { |
| <a name="l00859"></a>00859 |
| <a name="l00860"></a>00860 <span class="keywordflow">if</span>( this->current->prev == &(this->list->head) ) { |
| <a name="l00861"></a>00861 <span class="keywordflow">throw</span> NoSuchElementException( |
| <a name="l00862"></a>00862 __FILE__, __LINE__, <span class="stringliteral">"No more elements to return from next()"</span> ); |
| <a name="l00863"></a>00863 } |
| <a name="l00864"></a>00864 |
| <a name="l00865"></a>00865 this->current = this->current->prev; |
| <a name="l00866"></a>00866 |
| <a name="l00867"></a>00867 <span class="keywordflow">return</span> this->current->value; |
| <a name="l00868"></a>00868 } |
| <a name="l00869"></a>00869 |
| <a name="l00870"></a>00870 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <span class="keyword">remove</span>() { |
| <a name="l00871"></a>00871 <span class="keywordflow">throw</span> lang::exceptions::UnsupportedOperationException( |
| <a name="l00872"></a>00872 __FILE__, __LINE__, <span class="stringliteral">"Cannot write to a const Iterator."</span> ); |
| <a name="l00873"></a>00873 } |
| <a name="l00874"></a>00874 }; |
| <a name="l00875"></a>00875 |
| <a name="l00876"></a>00876 <span class="keyword">public</span>: |
| <a name="l00877"></a>00877 |
| <a name="l00878"></a>00878 <span class="keyword">using</span> AbstractSequentialList<E>::listIterator; |
| <a name="l00879"></a>00879 |
| <a name="l00880"></a><a class="code" href="classdecaf_1_1util_1_1_linked_list.html#af14c85c35db0a1cc0eba45e2224295e3">00880</a> <span class="keyword">virtual</span> <a class="code" href="classdecaf_1_1util_1_1_list_iterator.html" title="An iterator for lists that allows the programmer to traverse the list in either direction, modify the list during iteration, and obtain the iterator&#39;s current position in the list.">ListIterator<E></a>* <a class="code" href="classdecaf_1_1util_1_1_linked_list.html#af14c85c35db0a1cc0eba45e2224295e3">listIterator</a>( <span class="keywordtype">int</span> index ) { |
| <a name="l00881"></a>00881 <span class="keywordflow">return</span> <span class="keyword">new</span> LinkedListIterator( <span class="keyword">this</span>, index ); |
| <a name="l00882"></a>00882 } |
| <a name="l00883"></a><a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a03c74352ebf61f23353c07a168f8f288">00883</a> <span class="keyword">virtual</span> <a class="code" href="classdecaf_1_1util_1_1_list_iterator.html" title="An iterator for lists that allows the programmer to traverse the list in either direction, modify the list during iteration, and obtain the iterator&#39;s current position in the list.">ListIterator<E></a>* <a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a03c74352ebf61f23353c07a168f8f288">listIterator</a>( <span class="keywordtype">int</span> index )<span class="keyword"> const </span>{ |
| <a name="l00884"></a>00884 <span class="keywordflow">return</span> <span class="keyword">new</span> ConstLinkedListIterator( <span class="keyword">this</span>, index ); |
| <a name="l00885"></a>00885 } |
| <a name="l00886"></a>00886 |
| <a name="l00887"></a><a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a5c8d1cd6c03e8cf1c6cdd3f41b431e10">00887</a> <span class="keyword">virtual</span> <a class="code" href="classdecaf_1_1util_1_1_iterator.html" title="Defines an object that can be used to iterate over the elements of a collection.">Iterator<E></a>* <a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a5c8d1cd6c03e8cf1c6cdd3f41b431e10" title="Provides an Iterator over this Collection that traverses the element in reverse order.">descendingIterator</a>() { |
| <a name="l00888"></a>00888 <span class="keywordflow">return</span> <span class="keyword">new</span> ReverseIterator( <span class="keyword">this</span> ); |
| <a name="l00889"></a>00889 } |
| <a name="l00890"></a><a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a114bc28455f1fcfce83e16c2db3dd895">00890</a> <span class="keyword">virtual</span> <a class="code" href="classdecaf_1_1util_1_1_iterator.html" title="Defines an object that can be used to iterate over the elements of a collection.">Iterator<E></a>* <a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a114bc28455f1fcfce83e16c2db3dd895">descendingIterator</a>()<span class="keyword"> const </span>{ |
| <a name="l00891"></a>00891 <span class="keywordflow">return</span> <span class="keyword">new</span> ConstReverseIterator( <span class="keyword">this</span> ); |
| <a name="l00892"></a>00892 } |
| <a name="l00893"></a>00893 |
| <a name="l00894"></a>00894 <span class="keyword">private</span>: |
| <a name="l00895"></a>00895 |
| <a name="l00896"></a>00896 E removeAtFront() { |
| <a name="l00897"></a>00897 |
| <a name="l00898"></a>00898 <span class="keywordflow">if</span>( this->head.next == &this->tail ) { |
| <a name="l00899"></a>00899 <span class="keywordflow">throw</span> <a class="code" href="classdecaf_1_1util_1_1_no_such_element_exception.html">NoSuchElementException</a>( |
| <a name="l00900"></a>00900 __FILE__, __LINE__, <span class="stringliteral">"The Collection is empty."</span> ); |
| <a name="l00901"></a>00901 } |
| <a name="l00902"></a>00902 |
| <a name="l00903"></a>00903 ListNode<E>* oldNode = this->head.next; |
| <a name="l00904"></a>00904 E result = oldNode->value; |
| <a name="l00905"></a>00905 |
| <a name="l00906"></a>00906 this->head.next = oldNode->next; |
| <a name="l00907"></a>00907 this->head.next->prev = &this->head; |
| <a name="l00908"></a>00908 |
| <a name="l00909"></a>00909 <span class="keyword">delete</span> oldNode; |
| <a name="l00910"></a>00910 |
| <a name="l00911"></a>00911 this->listSize--; |
| <a name="l00912"></a>00912 AbstractList<E>::modCount++; |
| <a name="l00913"></a>00913 |
| <a name="l00914"></a>00914 <span class="keywordflow">return</span> result; |
| <a name="l00915"></a>00915 } |
| <a name="l00916"></a>00916 |
| <a name="l00917"></a>00917 E removeAtEnd() { |
| <a name="l00918"></a>00918 |
| <a name="l00919"></a>00919 <span class="keywordflow">if</span>( this->head.next == &this->tail ) { |
| <a name="l00920"></a>00920 <span class="keywordflow">throw</span> NoSuchElementException( |
| <a name="l00921"></a>00921 __FILE__, __LINE__, <span class="stringliteral">"The Collection is empty."</span> ); |
| <a name="l00922"></a>00922 } |
| <a name="l00923"></a>00923 |
| <a name="l00924"></a>00924 ListNode<E>* oldNode = this->tail.prev; |
| <a name="l00925"></a>00925 E result = oldNode->value; |
| <a name="l00926"></a>00926 |
| <a name="l00927"></a>00927 this->tail.prev = oldNode->prev; |
| <a name="l00928"></a>00928 this->tail.prev->next = &this->tail; |
| <a name="l00929"></a>00929 |
| <a name="l00930"></a>00930 <span class="keyword">delete</span> oldNode; |
| <a name="l00931"></a>00931 |
| <a name="l00932"></a>00932 this->listSize--; |
| <a name="l00933"></a>00933 AbstractList<E>::modCount++; |
| <a name="l00934"></a>00934 |
| <a name="l00935"></a>00935 <span class="keywordflow">return</span> result; |
| <a name="l00936"></a>00936 } |
| <a name="l00937"></a>00937 |
| <a name="l00938"></a>00938 <span class="keywordtype">void</span> addToFront( <span class="keyword">const</span> E& value ) { |
| <a name="l00939"></a>00939 |
| <a name="l00940"></a>00940 ListNode<E>* newHead = <span class="keyword">new</span> ListNode<E>( &this->head, this->head.next, value ); |
| <a name="l00941"></a>00941 |
| <a name="l00942"></a>00942 (this->head.next)->prev = newHead; |
| <a name="l00943"></a>00943 this->head.next = newHead; |
| <a name="l00944"></a>00944 |
| <a name="l00945"></a>00945 this->listSize++; |
| <a name="l00946"></a>00946 AbstractList<E>::modCount++; |
| <a name="l00947"></a>00947 } |
| <a name="l00948"></a>00948 |
| <a name="l00949"></a>00949 <span class="keywordtype">void</span> addToEnd( <span class="keyword">const</span> E& value ) { |
| <a name="l00950"></a>00950 |
| <a name="l00951"></a>00951 ListNode<E>* newTail = <span class="keyword">new</span> ListNode<E>( this->tail.prev, &this->tail, value ); |
| <a name="l00952"></a>00952 |
| <a name="l00953"></a>00953 (this->tail.prev)->next = newTail; |
| <a name="l00954"></a>00954 this->tail.prev = newTail; |
| <a name="l00955"></a>00955 |
| <a name="l00956"></a>00956 this->listSize++; |
| <a name="l00957"></a>00957 AbstractList<E>::modCount++; |
| <a name="l00958"></a>00958 } |
| <a name="l00959"></a>00959 |
| <a name="l00960"></a>00960 <span class="keywordtype">void</span> addAtLocation( <span class="keywordtype">int</span> index, <span class="keyword">const</span> E& value ) { |
| <a name="l00961"></a>00961 |
| <a name="l00962"></a>00962 ListNode<E>* location = NULL; |
| <a name="l00963"></a>00963 |
| <a name="l00964"></a>00964 <span class="keywordflow">if</span>( index <= this->listSize / 2 ) { |
| <a name="l00965"></a>00965 location = this->head.next; |
| <a name="l00966"></a>00966 <span class="keywordflow">for</span>( <span class="keywordtype">int</span> i = 0; i < index; ++i ) { |
| <a name="l00967"></a>00967 location = location->next; |
| <a name="l00968"></a>00968 } |
| <a name="l00969"></a>00969 } <span class="keywordflow">else</span> { |
| <a name="l00970"></a>00970 location = &this->tail; |
| <a name="l00971"></a>00971 <span class="keywordflow">for</span>( <span class="keywordtype">int</span> i = this->listSize; i > index; --i ) { |
| <a name="l00972"></a>00972 location = location->prev; |
| <a name="l00973"></a>00973 } |
| <a name="l00974"></a>00974 } |
| <a name="l00975"></a>00975 |
| <a name="l00976"></a>00976 ListNode<E>* newNode = <span class="keyword">new</span> ListNode<E>( location->prev, location, value ); |
| <a name="l00977"></a>00977 |
| <a name="l00978"></a>00978 (location->prev)->next = newNode; |
| <a name="l00979"></a>00979 location->prev = newNode; |
| <a name="l00980"></a>00980 |
| <a name="l00981"></a>00981 this->listSize++; |
| <a name="l00982"></a>00982 AbstractList<E>::modCount++; |
| <a name="l00983"></a>00983 } |
| <a name="l00984"></a>00984 |
| <a name="l00985"></a>00985 <span class="keywordtype">bool</span> addAllAtLocation( <span class="keywordtype">int</span> index, <span class="keyword">const</span> Collection<E>& collection ) { |
| <a name="l00986"></a>00986 |
| <a name="l00987"></a>00987 <span class="keywordflow">if</span>( index < 0 || index > this->listSize ) { |
| <a name="l00988"></a>00988 <span class="keywordflow">throw</span> <a class="code" href="classdecaf_1_1lang_1_1exceptions_1_1_index_out_of_bounds_exception.html">decaf::lang::exceptions::IndexOutOfBoundsException</a>( |
| <a name="l00989"></a>00989 __FILE__, __LINE__, <span class="stringliteral">"Index for add is outside bounds of this LinkedList."</span> ); |
| <a name="l00990"></a>00990 } |
| <a name="l00991"></a>00991 |
| <a name="l00992"></a>00992 <span class="keywordtype">int</span> csize = collection.size(); |
| <a name="l00993"></a>00993 <span class="keywordflow">if</span>( csize == 0 ) { |
| <a name="l00994"></a>00994 <span class="keywordflow">return</span> <span class="keyword">false</span>; |
| <a name="l00995"></a>00995 } |
| <a name="l00996"></a>00996 |
| <a name="l00997"></a>00997 std::auto_ptr< ArrayList<E> > <a class="code" href="classdecaf_1_1util_1_1_linked_list.html#a3c96177b1a2b1df1b35bb4f1331f4930" title="Renders this Collection as a Copy of the given Collection.">copy</a>; |
| <a name="l00998"></a>00998 std::auto_ptr< Iterator<E> > iter; |
| <a name="l00999"></a>00999 |
| <a name="l01000"></a>01000 <span class="keywordflow">if</span>( <span class="keyword">this</span> == &collection ) { |
| <a name="l01001"></a>01001 copy.reset( <span class="keyword">new</span> ArrayList<E>( collection ) ); |
| <a name="l01002"></a>01002 iter.reset( copy->iterator() ); |
| <a name="l01003"></a>01003 } <span class="keywordflow">else</span> { |
| <a name="l01004"></a>01004 iter.reset( collection.iterator() ); |
| <a name="l01005"></a>01005 } |
| <a name="l01006"></a>01006 |
| <a name="l01007"></a>01007 ListNode<E>* newNode = NULL; |
| <a name="l01008"></a>01008 ListNode<E>* previous = NULL; |
| <a name="l01009"></a>01009 |
| <a name="l01010"></a>01010 <span class="keywordflow">if</span>( index < this->listSize / 2 ) { |
| <a name="l01011"></a>01011 previous = &this->head; |
| <a name="l01012"></a>01012 <span class="keywordflow">for</span>( <span class="keywordtype">int</span> i = 0; i < index; ++i ) { |
| <a name="l01013"></a>01013 previous = previous->next; |
| <a name="l01014"></a>01014 } |
| <a name="l01015"></a>01015 } <span class="keywordflow">else</span> { |
| <a name="l01016"></a>01016 previous = &this->tail; |
| <a name="l01017"></a>01017 <span class="keywordflow">for</span>( <span class="keywordtype">int</span> i = this->listSize; i >= index; --i ) { |
| <a name="l01018"></a>01018 previous = previous->prev; |
| <a name="l01019"></a>01019 } |
| <a name="l01020"></a>01020 } |
| <a name="l01021"></a>01021 |
| <a name="l01022"></a>01022 <span class="keywordflow">while</span>( iter->hasNext() ) { |
| <a name="l01023"></a>01023 newNode = <span class="keyword">new</span> ListNode<E>( previous, previous->next, iter->next() ); |
| <a name="l01024"></a>01024 previous->next->prev = newNode; |
| <a name="l01025"></a>01025 previous->next = newNode; |
| <a name="l01026"></a>01026 previous = newNode; |
| <a name="l01027"></a>01027 } |
| <a name="l01028"></a>01028 |
| <a name="l01029"></a>01029 this->listSize += csize; |
| <a name="l01030"></a>01030 AbstractList<E>::modCount++; |
| <a name="l01031"></a>01031 |
| <a name="l01032"></a>01032 <span class="keywordflow">return</span> <span class="keyword">true</span>; |
| <a name="l01033"></a>01033 } |
| <a name="l01034"></a>01034 |
| <a name="l01035"></a>01035 <span class="keywordtype">void</span> purgeList() { |
| <a name="l01036"></a>01036 ListNode<E>* current = this->head.next; |
| <a name="l01037"></a>01037 ListNode<E>* temp = NULL; |
| <a name="l01038"></a>01038 <span class="keywordflow">while</span>( current != &this->tail ) { |
| <a name="l01039"></a>01039 temp = current; |
| <a name="l01040"></a>01040 current = current->next; |
| <a name="l01041"></a>01041 <span class="keyword">delete</span> temp; |
| <a name="l01042"></a>01042 } |
| <a name="l01043"></a>01043 } |
| <a name="l01044"></a>01044 }; |
| <a name="l01045"></a>01045 |
| <a name="l01046"></a>01046 }} |
| <a name="l01047"></a>01047 |
| <a name="l01048"></a>01048 <span class="preprocessor">#endif </span><span class="comment">/* _DECAF_UTIL_LINKEDLIST_H_ */</span> |
| </pre></div></div> |
| </div> |
| <div id="nav-path" class="navpath"> |
| <ul> |
| <li class="navelem"><a class="el" href="_linked_list_8h.html">LinkedList.h</a> </li> |
| <li class="footer">Generated on Mon Apr 25 2011 for activemq-cpp-3.4.0 by  |
| <a href="http://www.doxygen.org/index.html"> |
| <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.3 </li> |
| </ul> |
| </div> |
| |
| </body> |
| </html> |