Back to index

lightning-sunbird  0.9+nobinonly
nsAlgorithm.h
Go to the documentation of this file.
00001 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
00002 /* ***** BEGIN LICENSE BLOCK *****
00003  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
00004  *
00005  * The contents of this file are subject to the Mozilla Public License Version
00006  * 1.1 (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  * http://www.mozilla.org/MPL/
00009  *
00010  * Software distributed under the License is distributed on an "AS IS" basis,
00011  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
00012  * for the specific language governing rights and limitations under the
00013  * License.
00014  *
00015  * The Original Code is mozilla.org code.
00016  *
00017  * The Initial Developer of the Original Code is
00018  * Netscape Communications Corporation.
00019  * Portions created by the Initial Developer are Copyright (C) 1998
00020  * the Initial Developer. All Rights Reserved.
00021  *
00022  * Contributor(s):
00023  *   Scott Collins <scc@mozilla.org> (original author)
00024  *
00025  * Alternatively, the contents of this file may be used under the terms of
00026  * either of the GNU General Public License Version 2 or later (the "GPL"),
00027  * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
00028  * in which case the provisions of the GPL or the LGPL are applicable instead
00029  * of those above. If you wish to allow use of your version of this file only
00030  * under the terms of either the GPL or the LGPL, and not to allow others to
00031  * use your version of this file under the terms of the MPL, indicate your
00032  * decision by deleting the provisions above and replace them with the notice
00033  * and other provisions required by the GPL or the LGPL. If you do not delete
00034  * the provisions above, a recipient may use your version of this file under
00035  * the terms of any one of the MPL, the GPL or the LGPL.
00036  *
00037  * ***** END LICENSE BLOCK ***** */
00038 
00039 #ifndef nsAlgorithm_h___
00040 #define nsAlgorithm_h___
00041 
00042 #ifndef nsCharTraits_h___
00043 #include "nsCharTraits.h"
00044   // for |nsCharSourceTraits|, |nsCharSinkTraits|
00045 #endif
00046 
00047 #ifndef prtypes_h___
00048 #include "prtypes.h"
00049   // for |PRUint32|...
00050 #endif
00051 
00052 #ifndef nsDebug_h___
00053 #include "nsDebug.h"
00054   // for NS_ASSERTION
00055 #endif
00056 
00057 template <class T>
00058 inline
00059 const T&
00060 NS_MIN( const T& a, const T& b )
00061   {
00062     return b < a ? b : a;
00063   }
00064 
00065 template <class T>
00066 inline
00067 const T&
00068 NS_MAX( const T& a, const T& b )
00069   {
00070     return a > b ? a : b;
00071   }
00072 
00073 template <class InputIterator, class T>
00074 inline
00075 PRUint32
00076 NS_COUNT( InputIterator& first, const InputIterator& last, const T& value )
00077   {
00078     PRUint32 result = 0;
00079     for ( ; first != last; ++first )
00080       if ( *first == value )
00081         ++result;
00082     return result;
00083   }
00084 
00085 template <class InputIterator, class OutputIterator>
00086 inline
00087 OutputIterator&
00088 copy_string( InputIterator& first, const InputIterator& last, OutputIterator& result )
00089   {
00090     typedef nsCharSourceTraits<InputIterator> source_traits;
00091     typedef nsCharSinkTraits<OutputIterator>  sink_traits;
00092 
00093     while ( first != last )
00094       {
00095         PRInt32 count_copied = PRInt32(sink_traits::write(result, source_traits::read(first), source_traits::readable_distance(first, last)));
00096         NS_ASSERTION(count_copied > 0, "|copy_string| will never terminate");
00097         source_traits::advance(first, count_copied);
00098       }
00099 
00100     return result;
00101   }
00102 
00103 template <class InputIterator, class OutputIterator>
00104 OutputIterator&
00105 copy_string_backward( const InputIterator& first, InputIterator& last, OutputIterator& result )
00106   {
00107     while ( first != last )
00108       {
00109         last.normalize_backward();
00110         result.normalize_backward();
00111         PRUint32 lengthToCopy = PRUint32( NS_MIN(last.size_backward(), result.size_backward()) );
00112         if ( first.fragment().mStart == last.fragment().mStart )
00113           lengthToCopy = NS_MIN(lengthToCopy, PRUint32(last.get() - first.get()));
00114 
00115         NS_ASSERTION(lengthToCopy, "|copy_string_backward| will never terminate");
00116 
00117 #ifdef _MSC_VER
00118         // XXX Visual C++ can't stomach 'typename' where it rightfully should
00119         nsCharTraits<OutputIterator::value_type>::move(result.get()-lengthToCopy, last.get()-lengthToCopy, lengthToCopy);
00120 #else
00121         nsCharTraits<typename OutputIterator::value_type>::move(result.get()-lengthToCopy, last.get()-lengthToCopy, lengthToCopy);
00122 #endif
00123 
00124         last.advance( -PRInt32(lengthToCopy) );
00125         result.advance( -PRInt32(lengthToCopy) );
00126       }
00127 
00128     return result;
00129   }
00130 
00131 #endif // !defined(nsAlgorithm_h___)