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

127 lines
4.5 KiB
C++

/*
*
* Copyright (C) 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: dcmrt
*
* Author: Uli Schlachter
*
* Purpose: Template helper functions for searching through sequences
*
*/
#ifndef DRMSRCH_H
#define DRMSRCH_H
#include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */
namespace DRTSearch {
/**
* Given a function predicate, this iterates over an IOD and finds the
* first item for which the predicate returns true. The result will be the
* IOD's currentItem(). If nothing is found, currentItem() will return the
* EmptyDefaultItem.
* @tparam IOD the type of the IOD that should be checked
* @tparam Predicate the type of the search predicate
* @param iod the IOD to search through
* @param pred the predicate to check
* @return EC_IllegalCall if search failed, else EC_Normal
*/
template<typename IOD, typename Predicate>
static inline OFCondition findItem(IOD& iod, Predicate& pred)
{
OFCondition cond = iod.gotoFirstItem();
while (cond.good()) {
if (pred(iod.getCurrentItem()))
break;
cond = iod.gotoNextItem();
}
return cond;
}
/**
* This implements a search predicate for findItem which looks for some
* object attribute via the equality operator.
* @tparam IOD the type of the IOD that should be checked
* @tparam Item this should always be IOD::Item. Sadly, MSC6 can't figure
* that out by itself and so we must explicitly tell it about this type.
* @tparam type the type that is being searched for
* @tparam arg2 the type of the second argument to the getter function
* @tparam argument2 the value of the second argument to the getter function
*/
template<typename IOD, typename Item, typename type, typename arg2, arg2 argument2>
class searchPropertyEqual {
public:
/// Type of the getter-function that is used for getting the value.
typedef OFCondition (Item::*funcType)(type&, arg2) const;
/**
* Constructor
* @param expected the expected value that we are searching for
* @param func member function that gets us the value from the object
*/
searchPropertyEqual(const type& expected, funcType func) : m_expected(expected), m_func(func) { }
/// @return true if the given item has the wanted property
OFBool operator()(const Item& item) {
type value;
OFCondition cond = (item.*m_func)(value, argument2);
return cond.good() && value == m_expected;
}
private:
/// The expected value of an item
type m_expected;
/// Getter function which gets the actual value from an item
funcType m_func;
};
/**
* Helper class which wraps searchPropertyEqual and findItem to make it
* easier to search through an IOD.
* @tparam IOD the type of the IOD that should be checked
* @tparam Item this should always be IOD::Item. Sadly, MSC6 can't figure
* that out by itself and so we must explicitly tell it about this type.
* @tparam type the type that is being searched for
* @tparam arg2 the type of the second argument to the getter function
* @tparam argument2 the value of the second argument to the getter function
*/
template<typename IOD, typename Item, typename type, typename arg2, arg2 argument2>
class searchPropertyEqualHelper {
public:
/// Typedef for simplifying usage of searchPropertyEqual
typedef searchPropertyEqual<IOD, Item, type, arg2, argument2> searchType;
/**
* Find an item in a sequence
* @param seq the sequence to search through
* @param wanted the value that should be found
* @param func function that gets a value from a sequence item
* @return Reference to the first item that matches or to the empty
* default item.
*/
static typename IOD::Item& search(IOD& seq, const type& wanted, typename searchType::funcType func)
{
searchType s(wanted, func);
findItem<IOD, searchType>(seq, s);
// If the search failed, this will be the empty default item
return seq.getCurrentItem();
}
};
}
#endif