greenplumn CHashSetIter 源码

  • 2022-08-18
  • 浏览 (327)

greenplumn CHashSetIter 代码

文件路径:/src/backend/gporca/libgpos/include/gpos/common/CHashSetIter.h

//	Greenplum Database
//	Copyright (C) 2017 VMware, Inc. or its affiliates
//
//	Hash set iterator

#ifndef GPOS_CHashSetIter_H
#define GPOS_CHashSetIter_H

#include "gpos/base.h"
#include "gpos/common/CDynamicPtrArray.h"
#include "gpos/common/CHashSet.h"
#include "gpos/common/CStackObject.h"

namespace gpos
{
// Hash set iterator
template <class T, ULONG (*HashFn)(const T *),
		  BOOL (*EqFn)(const T *, const T *), void (*CleanupFn)(T *)>
class CHashSetIter : public CStackObject
{
	// short hand for hashset type
	using TSet = CHashSet<T, HashFn, EqFn, CleanupFn>;

private:
	// set to iterate
	const TSet *m_set;

	// current hashchain
	ULONG m_chain_idx;

	// current element
	ULONG m_elem_idx;

	// is initialized?
	BOOL m_is_initialized;

public:
	CHashSetIter(const CHashSetIter<T, HashFn, EqFn, CleanupFn> &) = delete;

	// ctor
	CHashSetIter<T, HashFn, EqFn, CleanupFn>(TSet *set)
		: m_set(set), m_chain_idx(0), m_elem_idx(0)
	{
		GPOS_ASSERT(nullptr != set);
	}

	// dtor
	virtual ~CHashSetIter<T, HashFn, EqFn, CleanupFn>() = default;

	// advance iterator to next element
	BOOL
	Advance()
	{
		if (m_elem_idx < m_set->m_elements->Size())
		{
			m_elem_idx++;
			return true;
		}

		return false;
	}

	// current element
	const T *
	Get() const
	{
		const typename TSet::CHashSetElem *elem = nullptr;
		T *t = (*(m_set->m_elements))[m_elem_idx - 1];
		elem = m_set->Lookup(t);
		if (nullptr != elem)
		{
			return elem->Value();
		}
		return nullptr;
	}

};	// class CHashSetIter

}  // namespace gpos

#endif	// !GPOS_CHashSetIter_H

// EOF

相关信息

greenplumn 源码目录

相关文章

greenplumn CAutoP 源码

greenplumn CAutoRef 源码

greenplumn CAutoRg 源码

greenplumn CAutoTimer 源码

greenplumn CBitSet 源码

greenplumn CBitSetIter 源码

greenplumn CBitVector 源码

greenplumn CDebugCounter 源码

greenplumn CDouble 源码

greenplumn CDynamicPtrArray 源码

0  赞