greenplumn CSyncHashtableAccessByIter 源码

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

greenplumn CSyncHashtableAccessByIter 代码

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

//---------------------------------------------------------------------------
//	Greenplum Database
//	Copyright (C) 2011 EMC Corp.
//
//	@filename:
//		CSyncHashtableAccessByIter.h
//
//	@doc:
//		Iterator's accessor provides protected access to hashtable elements
//		during iteration.
//---------------------------------------------------------------------------
#ifndef GPOS_CSyncHashtableAccessByIter_H
#define GPOS_CSyncHashtableAccessByIter_H


#include "gpos/common/CSyncHashtableAccessorBase.h"
#include "gpos/common/CSyncHashtableIter.h"


namespace gpos
{
//---------------------------------------------------------------------------
//	@class:
//		CSyncHashtableAccessByIter<T, K, S>
//
//	@doc:
//		Accessor class to provide access to the element pointed to by a
//		hash table iterator
//
//---------------------------------------------------------------------------
template <class T, class K>
class CSyncHashtableAccessByIter : public CSyncHashtableAccessorBase<T, K>
{
	// iterator class is a friend
	friend class CSyncHashtableIter<T, K>;

private:
	// shorthand for base class
	using Base = class CSyncHashtableAccessorBase<T, K>;

	// target iterator
	CSyncHashtableIter<T, K> &m_iter;

	// returns the first valid element starting from the given element
	T *
	FirstValid(T *value) const
	{
		GPOS_ASSERT(nullptr != value);

		T *curr = value;
		while (nullptr != curr &&
			   !Base::GetHashTable().IsValid(Base::GetHashTable().Key(curr)))
		{
			curr = Base::Next(curr);
		}

		return curr;
	}

public:
	CSyncHashtableAccessByIter<T, K>(const CSyncHashtableAccessByIter<T, K> &) =
		delete;

	// ctor
	explicit CSyncHashtableAccessByIter<T, K>(CSyncHashtableIter<T, K> &iter)
		: Base(iter.m_ht, iter.m_bucket_idx), m_iter(iter)
	{
	}

	// returns the element pointed to by iterator
	T *
	Value() const
	{
		GPOS_ASSERT(m_iter.m_invalid_elem_inserted &&
					"Iterator's advance is not called");

		// advance in the current bucket until finding a valid element;
		// this is needed because the next valid element pointed to by
		// iterator might have been deleted by another client just before
		// using the accessor

		return FirstValid(m_iter.m_invalid_elem);
	}

};	// class CSyncHashtableAccessByIter

}  // namespace gpos

#endif	// !GPOS_CSyncHashtableAccessByIter_H

// EOF

相关信息

greenplumn 源码目录

相关文章

greenplumn CAutoP 源码

greenplumn CAutoRef 源码

greenplumn CAutoRg 源码

greenplumn CAutoTimer 源码

greenplumn CBitSet 源码

greenplumn CBitSetIter 源码

greenplumn CBitVector 源码

greenplumn CDebugCounter 源码

greenplumn CDouble 源码

greenplumn CDynamicPtrArray 源码

0  赞