greenplumn CSyncHashtableAccessByIter 源码
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
相关信息
相关文章
0
赞
热门推荐
-
2、 - 优质文章
-
3、 gate.io
-
7、 golang
-
9、 openharmony
-
10、 Vue中input框自动聚焦