activemq-cpp-3.3.0

src/main/decaf/util/AbstractSequentialList.h

Go to the documentation of this file.
00001 /*
00002  * Licensed to the Apache Software Foundation (ASF) under one or more
00003  * contributor license agreements.  See the NOTICE file distributed with
00004  * this work for additional information regarding copyright ownership.
00005  * The ASF licenses this file to You under the Apache License, Version 2.0
00006  * (the "License"); you may not use this file except in compliance with
00007  * the License.  You may obtain a copy of the License at
00008  *
00009  *     http://www.apache.org/licenses/LICENSE-2.0
00010  *
00011  * Unless required by applicable law or agreed to in writing, software
00012  * distributed under the License is distributed on an "AS IS" BASIS,
00013  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
00014  * See the License for the specific language governing permissions and
00015  * limitations under the License.
00016  */
00017 
00018 #ifndef _DECAF_UTIL_ABSTRACTSEQUENTIALLIST_H_
00019 #define _DECAF_UTIL_ABSTRACTSEQUENTIALLIST_H_
00020 
00021 #include <decaf/util/Config.h>
00022 #include <decaf/lang/exceptions/UnsupportedOperationException.h>
00023 #include <decaf/lang/exceptions/NullPointerException.h>
00024 #include <decaf/lang/exceptions/IllegalArgumentException.h>
00025 #include <decaf/lang/Iterable.h>
00026 #include <decaf/util/Iterator.h>
00027 #include <decaf/util/AbstractList.h>
00028 #include <memory>
00029 
00030 namespace decaf {
00031 namespace util {
00032 
00058     template< typename E >
00059     class AbstractSequentialList : public decaf::util::AbstractList<E> {
00060     public:
00061 
00062         using AbstractList<E>::add;
00063         using AbstractList<E>::addAll;
00064 
00065     public:
00066 
00067         virtual ~AbstractSequentialList() {}
00068 
00069         virtual Iterator<E>* iterator() {
00070             return this->listIterator( 0 );
00071         }
00072         virtual Iterator<E>* iterator() const {
00073             return this->listIterator( 0 );
00074         }
00075 
00076         virtual ListIterator<E>* listIterator() {
00077             return this->listIterator( 0 );
00078         }
00079         virtual ListIterator<E>* listIterator() const {
00080             return this->listIterator( 0 );
00081         }
00082 
00083         virtual ListIterator<E>* listIterator( int index DECAF_UNUSED ) {
00084             throw decaf::lang::exceptions::UnsupportedOperationException(
00085                 __FILE__, __LINE__, "Abstract sequential list does not implement the listIterator." );
00086         }
00087         virtual ListIterator<E>* listIterator( int index DECAF_UNUSED ) const {
00088             throw decaf::lang::exceptions::UnsupportedOperationException(
00089                 __FILE__, __LINE__, "Abstract sequential list does not implement the listIterator." );
00090         }
00091 
00099         virtual E get( int index ) const {
00100 
00101             try {
00102                 std::auto_ptr< ListIterator<E> > iter( this->listIterator( index ) );
00103                 return iter->next();
00104             } catch( decaf::util::NoSuchElementException& ex ) {
00105                 throw decaf::lang::exceptions::IndexOutOfBoundsException(
00106                     __FILE__, __LINE__, "get called with invalid index." );
00107             }
00108         }
00109 
00117         virtual E set( int index, const E& element ) {
00118 
00119             try {
00120                 std::auto_ptr< ListIterator<E> > iter( this->listIterator( index ) );
00121                 E result = iter->next();
00122                 iter->set( element );
00123                 return result;
00124             } catch( decaf::util::NoSuchElementException& ex ) {
00125                 throw decaf::lang::exceptions::IndexOutOfBoundsException(
00126                     __FILE__, __LINE__, "set called with invalid index." );
00127             }
00128         }
00129 
00137         virtual void add( int index, const E& element ) {
00138 
00139             try {
00140                 std::auto_ptr< ListIterator<E> > iter( this->listIterator( index ) );
00141                 iter->add( element );
00142             } catch( decaf::util::NoSuchElementException& ex ) {
00143                 throw decaf::lang::exceptions::IndexOutOfBoundsException(
00144                     __FILE__, __LINE__, "add called with invalid index." );
00145             }
00146         }
00147 
00157         virtual bool addAll( int index, const Collection<E>& source ) {
00158 
00159             std::auto_ptr< ListIterator<E> > iter( this->listIterator( index ) );
00160             std::auto_ptr< Iterator<E> > srcIter( source.iterator() );
00161             int next = iter->nextIndex();
00162             while( srcIter->hasNext() ) {
00163                 iter->add( srcIter->next() );
00164             }
00165             return next != iter->nextIndex();
00166         }
00167 
00174         virtual E removeAt( int index ) {
00175 
00176             try {
00177                 std::auto_ptr< ListIterator<E> > iter( this->listIterator( index ) );
00178                 E result = iter->next();
00179                 iter->remove();
00180                 return result;
00181             } catch( decaf::util::NoSuchElementException& ex ) {
00182                 throw decaf::lang::exceptions::IndexOutOfBoundsException(
00183                     __FILE__, __LINE__, "set called with invalid index." );
00184             }
00185         }
00186 
00187     };
00188 
00189 }}
00190 
00191 #endif /* _DECAF_UTIL_ABSTRACTSEQUENTIALLIST_H_ */