//
// Copyright (C) 2004 Tanguy Fautré.
// For conditions of distribution and use,
// see copyright notice in tri_stripper.h
//
//////////////////////////////////////////////////////////////////////
// SVN: $Id: policy.cpp 86 2005-06-08 17:47:27Z gpsnoopy $
//////////////////////////////////////////////////////////////////////

#include "detail/policy.h"




namespace triangle_stripper {

	namespace detail {




void policy::Challenge(strip Strip, size_t Degree, size_t CacheHits)
{
	if (Strip.Size() < m_MinStripSize)
		return;

	// Cache is disabled, take the longest strip
	if (! m_Cache) {

		if (Strip.Size() > m_Strip.Size())
			m_Strip = Strip;

	// Cache simulator enabled
	} else {

		// Priority 1: Keep the strip with the best cache hit count
		if (CacheHits > m_CacheHits) {
			m_Strip = Strip;
			m_Degree = Degree;
			m_CacheHits = CacheHits;

		} else if (CacheHits == m_CacheHits) {

			// Priority 2: Keep the strip with the loneliest start triangle
			if ((m_Strip.Size() != 0) && (Degree < m_Degree)) {
				m_Strip = Strip;
				m_Degree = Degree;

			// Priority 3: Keep the longest strip 
			} else if (Strip.Size() > m_Strip.Size()) {
				m_Strip = Strip;
				m_Degree = Degree;
			}
		}
	}
}




	} // namespace detail

} // namespace triangle_stripper
