DYT/Tool/3rdParty_x64/include/dcmtk/ofstd/ofalgo.h
2024-11-22 23:19:31 +08:00

215 lines
7.3 KiB
C++

/*
*
* Copyright (C) 1997-2012, OFFIS e.V.
* All rights reserved. See COPYRIGHT file for details.
*
* This software and supporting documentation were developed by
*
* OFFIS e.V.
* R&D Division Health
* Escherweg 2
* D-26121 Oldenburg, Germany
*
*
* Module: ofstd
*
* Author: Andreas Barth
*
* Purpose:
* Defines template algorithms for contaimer classes with
* interfaces similar to the C++ Standard
*
*/
#ifndef OFALGO_H
#define OFALGO_H
#include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */
#include "dcmtk/ofstd/oftypes.h"
// Usage:
// Function_type OFForEach(InputIterator_type, Function_type, first, last ,f)
// Applies function f from type Function_type to the result of
// derferencing every iterator in the range [first, last) starting
// with first and proceeding to last -1 (first, last are of type
// InputIterator_type). Returns f.
//
// InputIterator_type OFFind(InputIterator_type, T_type, first, last, value)
// Returns the first Iterator i of type InputIterator_type in the range
// [first, last) for which *i == value (of type T_type). Returns last,
// if no such iterator is found
//
// InputIterator_type OFFindIf(InputIterator_type, Predicate_type,
// first, last, pred)
// Returns the first iterator i of type InputIterator_type in the range
// [first, last) for which pred(*i) != false. The function pred is of
// type Predicate_type. Returns last, if no such iterator is found
//
// ForwardIterator OFAdjacentFind(ForwardIterator_type, first, last)
// Returns the first iterator i of type ForwardIterator_type such
// that both i and i+1 are in the range [first, last) and *i == *(i+1)
// returns last, if no such iterator is found. i+1 means the successor
// of i.
//
// ForwardIterator OFAdjacentFindPred(ForwardIterator_type,
// BinaryPredicate_type,
// first, last, pred)
// Returns the first iterator i of type ForwardIterator_type such
// that both i and i+1 are in the range [first, last) and
// pred (*i, *(i+1)) != false.
// Returns last, if no such iterator is found. i+1 means the successor
// of i.
//
// Additional Remarks:
// In some template functions one template parameter is another function.
// Some compilers cannot determine automatically the type of template
// function parameters, so you must give them a hint casting
// the parameter function to the correct type (e.g. NeXT gcc 2.5.8)
#if defined(HAVE_STL) || defined(HAVE_STL_ALGORITHMS)
// It is possible to use the standard template library list class since the
// interface is nearly identical.
// Important: If you want to use the standard template library (STL), no
// variable within a namespace using a class of the STL shall have a name
// of one class of the STL
#include <algorithm>
#define OFForEach(InputIterator_type, Function_type, first, last, f) STD_NAMESPACE for_each((first), (last), (f))
#define OFFind(InputIterator_type, T_type, first, last, value) STD_NAMESPACE find((first), (last), (value))
#define OFFindIf(InputIterator_type, Predicate_type, first, last, pred) STD_NAMESPACE find_if((first), (last), (pred))
#define OFAdjacentFind(ForwardIterator_type, first, last) STD_NAMESPACE adjacent_find((first), (last))
#define OFAdjacentFindPred(ForwardIterator_type, BinaryPredicate_type, first, last, pred) STD_NAMESPACE adjacent_find((first), (last), (pred))
#else
#ifdef HAVE_FUNCTION_TEMPLATE
#define OFForEach(InputIterator_type, Function_type, first, last, f) OF_ForEach((first), (last), (f))
#define OFFind(InputIterator_type, T_type, first, last, value) OF_Find((first), (last), (value))
#define OFFindIf(InputIterator_type, Predicate_type, first, last, pred) OF_FindIf((first), (last), (pred))
#define OFAdjacentFind(ForwardIterator_type, first, last) OF_AdjacentFind((first), (last))
#define OFAdjacentFindPred(ForwardIterator_type, BinaryPredicate_type, first, last, pred) OF_AdjacentFind((first), (last), (pred))
#elif defined(HAVE_STATIC_TEMPLATE_METHOD)
#define OFForEach(InputIterator_type, Function_type, first, last, f) OF_ForEachClass<InputIterator_type, Function_type>::OF_ForEach((first), (last), (f))
#define OFFind(InputIterator_type, T_type, first, last, value) OF_FindClass<InputIterator_type, T_type>::OF_Find((first), (last), (value))
#define OFFindIf(InputIterator_type, Predicate_type, first, last, pred) OF_FindIfClass<InputIterator_type, Predicate_type>::OF_FindIf((first), (last), (pred))
#define OFAdjacentFind(ForwardIterator_type, first, last) OF_AdjacentFindClass<ForwardIterator_type, int>::OF_AdjacentFind((first), (last))
#define OFAdjacentFindPred(ForwardIterator_type, BinaryPredicate_type, first, last, pred) OF_AdjacentFindPredClass<ForwardIterator_type, BinaryPredicate_type>::OF_AdjacentFind((first), (last), (pred))
#else
#error Your C++ Compiler is not capable of compiling this code
#endif
template <class InputIterator, class Function>
#if defined(HAVE_STATIC_TEMPLATE_METHOD) && !defined(HAVE_FUNCTION_TEMPLATE)
class OF_ForEachClass
{
public:
static
#endif
Function OF_ForEach(InputIterator first, InputIterator last, Function f)
{
while (first != last)
{
f(*first);
++first;
}
return f;
}
#if defined(HAVE_STATIC_TEMPLATE_METHOD) && !defined(HAVE_FUNCTION_TEMPLATE)
};
#endif
template <class InputIterator, class T>
#if defined(HAVE_STATIC_TEMPLATE_METHOD) && !defined(HAVE_FUNCTION_TEMPLATE)
class OF_FindClass
{
public:
static
#endif
InputIterator OF_Find(InputIterator first, InputIterator last, const T & value)
{
while (first != last && *first != value) ++ first;
return first;
}
#if defined(HAVE_STATIC_TEMPLATE_METHOD) && !defined(HAVE_FUNCTION_TEMPLATE)
};
#endif
template <class InputIterator, class Predicate>
#if defined(HAVE_STATIC_TEMPLATE_METHOD) && !defined(HAVE_FUNCTION_TEMPLATE)
class OF_FindIfClass
{
public:
static
#endif
InputIterator OF_FindIf(InputIterator first, InputIterator last,
Predicate pred)
{
while (first != last && !pred(*first)) ++first;
return first;
}
#if defined(HAVE_STATIC_TEMPLATE_METHOD) && !defined(HAVE_FUNCTION_TEMPLATE)
};
#endif
template <class ForwardIterator>
#if defined(HAVE_STATIC_TEMPLATE_METHOD) && !defined(HAVE_FUNCTION_TEMPLATE)
class OF_AdjacentFindClass
{
public:
static
#endif
ForwardIterator OF_AdjacentFind(ForwardIterator first, ForwardIterator last)
{
if (first == last) return last;
ForwardIterator next(first);
while (++next != last)
{
if (*first == *next) return *first;
++first;
}
return last;
}
#if defined(HAVE_STATIC_TEMPLATE_METHOD) && !defined(HAVE_FUNCTION_TEMPLATE)
};
#endif
template <class ForwardIterator, class BinaryPredicate>
#if defined(HAVE_STATIC_TEMPLATE_METHOD) && !defined(HAVE_FUNCTION_TEMPLATE)
class OF_AdjacentFindPredClass
{
public:
static
#endif
ForwardIterator OF_AdjacentFind(ForwardIterator first, ForwardIterator last,
BinaryPredicate pred)
{
if (first == last) return last;
ForwardIterator next = first;
while(++next != last)
{
if (pred(*first, *last)) return first;
++first;
}
return last;
}
#if defined(HAVE_STATIC_TEMPLATE_METHOD) && !defined(HAVE_FUNCTION_TEMPLATE)
};
#endif
#endif
#endif /* OFALGO_H */