view usr/src/cmd/man/src/util/nsgmls.src/include/RangeMap.h @ 4:1a15d5aaf794

synchronized with onnv_86 (6202) in onnv-gate
author Koji Uno <koji.uno@sun.com>
date Mon, 31 Aug 2009 14:38:03 +0900
parents c9caec207d52
children
line wrap: on
line source

/*
 * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

/*
 * Copyright 1994 James Clark
 * See the file COPYING for copying permission.
 */

#pragma ident	"%Z%%M%	%I%	%E% SMI"

#ifndef _RANGEMAP_H
#define	_RANGEMAP_H

#ifndef RangeMap_INCLUDED
#define	RangeMap_INCLUDED 1

#include "Vector.h"
#include "Boolean.h"
#include "ISet.h"
#include "types.h"
#include <stddef.h>

#ifdef SP_NAMESPACE
namespace SP_NAMESPACE {
#endif

template < class From, class To >
struct RangeMapRange {
	From fromMin;
	From fromMax;
	To toMin;
};

template < class From, class To > class RangeMapIter;
template < class From, class To > class RangeMap;

template < class From, class To >
class RangeMap {
public:
	RangeMap();
	Boolean map(From, To &, From &alsoMax) const;
	// Return 0 for no matches, 1 for 1, 2 for more than 1.
	unsigned inverseMap(To, From &, ISet < WideChar > &, \
		WideChar &count) const;
	void addRange(From, From, To);
private:
	Vector < RangeMapRange < From, To > > ranges_;
	friend class RangeMapIter < From, To >\
;
};

template < class From, class To >
class RangeMapIter {
public:
	RangeMapIter(const RangeMap < From, To > &map);
	Boolean next(From &fromMin, From &fromMax, To &toMin) {
		if (!count_)
			return (0);
		else {
			fromMin = ptr_->fromMin;
			fromMax = ptr_->fromMax;
			toMin = ptr_->toMin;
			ptr_++;
			count_--;
			return (1);
		}
	}
private:
	size_t count_;
	typename Vector < RangeMapRange < From, To > >\
::const_iterator ptr_;
};

#ifdef SP_NAMESPACE
}
#endif

#endif /* not RangeMap_INCLUDED */

#ifdef SP_DEFINE_TEMPLATES
#include "RangeMap.cxx"
#endif

#endif /* _RANGEMAP_H */