summaryrefslogtreecommitdiff
path: root/framework/inc/classes/checkediterator.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'framework/inc/classes/checkediterator.hxx')
-rw-r--r--framework/inc/classes/checkediterator.hxx345
1 files changed, 345 insertions, 0 deletions
diff --git a/framework/inc/classes/checkediterator.hxx b/framework/inc/classes/checkediterator.hxx
new file mode 100644
index 000000000000..7c337b023ba3
--- /dev/null
+++ b/framework/inc/classes/checkediterator.hxx
@@ -0,0 +1,345 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef __FRAMEWORK_CLASSES_CHECKEDITERATOR_HXX_
+#define __FRAMEWORK_CLASSES_CHECKEDITERATOR_HXX_
+
+//_________________________________________________________________________________________________________________
+// my own includes
+//_________________________________________________________________________________________________________________
+
+#include <macros/debug.hxx>
+
+//_________________________________________________________________________________________________________________
+// interface includes
+//_________________________________________________________________________________________________________________
+
+//_________________________________________________________________________________________________________________
+// other includes
+//_________________________________________________________________________________________________________________
+#include <sal/types.h>
+
+#ifndef __SGI_STL_ITERATOR
+#include <iterator>
+#endif
+
+//_________________________________________________________________________________________________________________
+// namespace
+//_________________________________________________________________________________________________________________
+
+namespace framework{
+
+//_________________________________________________________________________________________________________________
+// exported const
+//_________________________________________________________________________________________________________________
+
+//_________________________________________________________________________________________________________________
+// exported definitions
+//_________________________________________________________________________________________________________________
+
+/*-************************************************************************************************************//**
+ @short implement a iterator which support 2 end states!
+ @descr For our search methods we need a "walking" iterator object with special functionality!
+ We must check for 3 different states of an iterator - normal position, exact end, after end.
+ It's neccessary to detect if we have not found a entry and must return our default or
+ default already returned and we must break loop!
+ see using in class FilterCache too for further informations!
+
+ @Attention If your wish to debug this inline code ...
+ under windows and msdev you can use "set ENVCFLAGS=/Ob0" to do that!
+
+ @implements -
+ @base -
+
+ @devstatus ready to use
+ @threadsafe no
+*//*-*************************************************************************************************************/
+
+template< class TContainer >
+class CheckedIterator
+{
+ //-------------------------------------------------------------------------------------------------------------
+ // public methods
+ //-------------------------------------------------------------------------------------------------------------
+
+ public:
+
+ //---------------------------------------------------------------------------------------------------------
+ // constructor / destructor
+ //---------------------------------------------------------------------------------------------------------
+
+ /*-****************************************************************************************************//**
+ @short standard constructor
+ @descr Set default values on members.
+ We set it internal to E_UNKNOWN to detect uninitialized instances of this class.
+ If we found one - we know: "We must call initialize first!"
+
+ @seealso -
+
+ @param -
+ @return -
+
+ @onerror -
+ *//*-*****************************************************************************************************/
+
+ inline CheckedIterator()
+ : m_eEndState ( E_UNKNOWN )
+ , m_pContainer( NULL )
+ {
+ }
+
+ //---------------------------------------------------------------------------------------------------------
+ // interface methods
+ //---------------------------------------------------------------------------------------------------------
+
+ /*-****************************************************************************************************//**
+ @short initialize instance with valid container
+ @descr Set new container at an instance of this class. The other member will set automaticly!
+ m_pPosition = first element in container
+ m_eEndState = BEFOREEND
+
+ @seealso -
+
+ @param "rContainer", must be a valid reference to an existing container.
+ @return -
+
+ @onerror An assertion is thrown.
+ *//*-*****************************************************************************************************/
+
+ inline void initialize( const TContainer& rContainer )
+ {
+ // Check incoming parameter. We don't accept all!
+ LOG_ASSERT2( &rContainer==NULL , "CheckedIterator::initialize()", "Invalid parameter detected!" )
+ LOG_ASSERT2( m_eEndState!=E_UNKNOWN , "CheckedIterator::initialize()", "Instance already initialized! Don't do it again." )
+
+ if( m_eEndState == E_UNKNOWN )
+ {
+ // Set new container and update other member.
+ m_pContainer = &rContainer ;
+ m_eEndState = E_BEFOREEND ;
+ m_pPosition = m_pContainer->begin();
+ }
+ }
+
+ /*-****************************************************************************************************//**
+ @short set internal states to E_END
+ @descr Sometimes we need a "walking" check-iterator which is initialized with the END-state!
+ We need it to return one default value if no other ones exist ...
+
+ @seealso using in class FilterCache!
+
+ @param -
+ @return -
+
+ @onerror -
+ *//*-*****************************************************************************************************/
+
+ inline void setEnd()
+ {
+ m_pContainer = NULL ;
+ m_eEndState = E_END ;
+ }
+
+ /*-****************************************************************************************************//**
+ @short set internal states to E_AFTEREND
+ @descr Sometimes we need a "walking" check-iterator which is initialized with AFTEREND-state!
+ We need it if we don't have a container but must prevent us against further searching!
+
+ @seealso using in class FilterCache!
+
+ @param -
+ @return -
+
+ @onerror -
+ *//*-*****************************************************************************************************/
+
+ inline void setAfterEnd()
+ {
+ m_pContainer = NULL ;
+ m_eEndState = E_AFTEREND ;
+ }
+
+ /*-****************************************************************************************************//**
+ @short reset this iterator
+ @descr It must be called on an already initialized iterator.
+ Means the member m_pContainer must be valid. Otherwhise the reaction
+ isn't defined.
+
+ @param -
+ @return -
+
+ @onerror -
+ *//*-*****************************************************************************************************/
+
+ inline void reset()
+ {
+ m_eEndState = E_UNKNOWN;
+ m_pContainer = NULL;
+ }
+
+ /*-****************************************************************************************************//**
+ @short step to next element in container.
+ @descr If end of container is reached we change our internal "m_eEndState".
+ If end reached for first time; we set it to E_END;
+ If you step to next element again; we set it to E_AFTEREND.
+ So you have a chance to differ between "exact end" and "after end"!
+
+ @seealso method isEnd()
+ @seealso method isAfterEnd()
+
+ @param -
+ @return A reference to our changed object himself.
+
+ @onerror -
+ *//*-*****************************************************************************************************/
+
+ inline CheckedIterator& operator++()
+ {
+ // Warn programmer if he forget to initailize object!
+ LOG_ASSERT2( m_pContainer==NULL, "CheckedIterator::operator++()", "Object not initialized!" )
+ // Step to next element if any exist or set our end states.
+ switch( m_eEndState )
+ {
+ case E_BEFOREEND: {
+ ++m_pPosition;
+ // If iterator reaching end ... set right state!
+ if( m_pPosition == m_pContainer->end() )
+ {
+ m_eEndState = E_END;
+ }
+ }
+ break;
+ case E_END : {
+ // Set state only ... iterator already points to end of container!
+ m_eEndState = E_AFTEREND;
+ }
+ break;
+ }
+ return *this;
+ }
+
+ /*-****************************************************************************************************//**
+ @short return true if internal iterator was not initialized before
+ @descr These will be true, if use start a new search by using these iterator mechanism!
+
+ @seealso class FilterCache
+
+ @param -
+ @return True if internalk state E_UNKNOWN - false otherwise.
+
+ @onerror -
+ *//*-*****************************************************************************************************/
+
+ inline sal_Bool isUninitialized()
+ {
+ return( m_eEndState == E_UNKNOWN );
+ }
+
+ /*-****************************************************************************************************//**
+ @short return true if internal iterator reached end of container
+ @descr These will be true if you step to the end of internal container.
+
+ @seealso method isAfterEnd()
+
+ @param -
+ @return True if end reached; false otherwise.
+
+ @onerror -
+ *//*-*****************************************************************************************************/
+
+ inline sal_Bool isEnd()
+ {
+ // Is true if one end state is set!
+ return (
+ ( m_eEndState == E_END ) ||
+ ( m_eEndState == E_AFTEREND )
+ );
+ }
+
+ /*-****************************************************************************************************//**
+ @short return true if you call operator++ again and end already reached
+ @descr These indicate, that end already reached but you call operator++ again and again!
+
+ @seealso method isEnd()
+
+ @param -
+ @return True if end multiple reached; false otherwise.
+
+ @onerror -
+ *//*-*****************************************************************************************************/
+
+ inline sal_Bool isAfterEnd()
+ {
+ // Is true only, if special end state is set!
+ return( m_eEndState == E_AFTEREND );
+ }
+
+ /*-****************************************************************************************************//**
+ @short support readonly access to container entry
+ @descr Use it to get the value of current container item.
+
+ @seealso -
+
+ @param -
+ @return A reference to value of container entry.
+
+ @onerror -
+ *//*-*****************************************************************************************************/
+
+ inline typename TContainer::const_iterator getEntry()
+ {
+ // Warn programmer if he forget to initialize these object ...
+ LOG_ASSERT2( m_pContainer==NULL, "CheckedIterator::getEntry()", "Object not initialized!" )
+ // or try to read a non existing element!
+ LOG_ASSERT2( m_eEndState!=E_BEFOREEND, "CheckedIterator::getEntry()", "Wrong using of class detected!" )
+
+ return m_pPosition;
+ }
+
+ //-------------------------------------------------------------------------------------------------------------
+ // private member
+ //-------------------------------------------------------------------------------------------------------------
+
+ private:
+
+ // These enum defines our four states for an iterator position in curent container.
+ enum EEndState
+ {
+ E_UNKNOWN ,
+ E_BEFOREEND ,
+ E_END ,
+ E_AFTEREND
+ };
+
+ const TContainer* m_pContainer ; // pointer to current container
+ EEndState m_eEndState ; // "position state" of iterator!
+ typename TContainer::const_iterator m_pPosition ; // point to actual element in container
+};
+
+} // namespace framework
+
+#endif // #ifndef __FRAMEWORK_CLASSES_CHECKEDITERATOR_HXX_