📄 reduce.h
字号:
index_ = tiny(int());
}
void reset(T_resulttype)
{
BZPRECHECK(0, "Provided initial value for ReduceMaxIndex");
reset();
}
static const char* name()
{ return "maxIndex"; }
protected:
T_sourcetype max_;
int index_;
};
template<class P_sourcetype, int N_rank>
class ReduceMaxIndexVector {
public:
typedef P_sourcetype T_sourcetype;
typedef TinyVector<int,N_rank> T_resulttype;
typedef T_resulttype T_numtype;
enum { canProvideInitialValue = 0 };
ReduceMaxIndexVector()
{ reset(); }
ReduceMaxIndexVector(T_resulttype max)
{
reset(max);
}
bool operator()(T_sourcetype x)
{
BZPRECONDITION(0);
return false;
}
bool operator()(T_sourcetype x, const TinyVector<int,N_rank>& index)
{
if (x > max_)
{
max_ = x;
index_ = index;
}
return true;
}
T_resulttype result(int)
{ return index_; }
void reset()
{
max_ = tiny(T_sourcetype());
index_ = tiny(int());
}
void reset(T_resulttype)
{
BZPRECHECK(0, "Provided initial value for ReduceMaxIndex");
reset();
}
static const char* name()
{ return "maxIndex"; }
protected:
T_sourcetype max_;
TinyVector<int,N_rank> index_;
};
template<class P_sourcetype>
class ReduceFirst {
public:
typedef P_sourcetype T_sourcetype;
typedef int T_resulttype;
typedef T_resulttype T_numtype;
enum { needIndex = 1, canProvideInitialValue = 0 };
ReduceFirst()
{ reset(); }
ReduceFirst(T_resulttype)
{
BZPRECONDITION(0);
}
bool operator()(T_sourcetype x)
{
BZPRECONDITION(0);
return false;
}
bool operator()(T_sourcetype x, int index)
{
if (x)
{
index_ = index;
return false;
}
else
return true;
}
T_resulttype result(int)
{ return index_; }
void reset()
{
index_ = tiny(int());
}
void reset(T_resulttype)
{
BZPRECHECK(0, "Provided initial value for ReduceFirst");
reset();
}
static const char* name()
{ return "first"; }
protected:
int index_;
};
template<class P_sourcetype>
class ReduceLast {
public:
typedef P_sourcetype T_sourcetype;
typedef int T_resulttype;
typedef T_resulttype T_numtype;
enum { needIndex = 1, canProvideInitialValue = 0 };
ReduceLast()
{ reset(); }
ReduceLast(T_resulttype)
{
BZPRECONDITION(0);
}
bool operator()(T_sourcetype x)
{
BZPRECONDITION(0);
return false;
}
bool operator()(T_sourcetype x, int index)
{
if (x)
{
index_ = index;
return true;
}
else
return true;
}
T_resulttype result(int)
{ return index_; }
void reset()
{
index_ = huge(int());
}
void reset(T_resulttype)
{
BZPRECHECK(0, "Provided initial value for ReduceFirst");
reset();
}
static const char* name()
{ return "last"; }
protected:
int index_;
};
template<class P_sourcetype, class P_resulttype = BZ_SUMTYPE(P_sourcetype)>
class ReduceProduct {
public:
typedef P_sourcetype T_sourcetype;
typedef P_resulttype T_resulttype;
typedef T_resulttype T_numtype;
enum { needIndex = 0, canProvideInitialValue = 1 };
ReduceProduct()
{ product_ = one(T_resulttype()); }
ReduceProduct(T_resulttype initialValue)
{ product_ = initialValue; }
bool operator()(T_sourcetype x)
{
product_ *= x;
return true;
}
bool operator()(T_sourcetype x, int)
{
product_ *= x;
return true;
}
T_resulttype result(int)
{ return product_; }
void reset()
{ product_ = one(T_resulttype()); }
void reset(T_resulttype initialValue)
{ product_ = initialValue; }
static const char* name()
{ return "product"; }
protected:
T_resulttype product_;
};
template<class P_sourcetype>
class ReduceCount {
public:
typedef P_sourcetype T_sourcetype;
typedef int T_resulttype;
typedef T_resulttype T_numtype;
enum { needIndex = 0, canProvideInitialValue = 1 };
ReduceCount()
{ reset(); }
ReduceCount(T_resulttype count)
{
count_ = count;
}
bool operator()(T_sourcetype x)
{
if (x)
++count_;
return true;
}
bool operator()(T_sourcetype x, int)
{
if (x)
++count_;
return true;
}
T_resulttype result(int)
{ return count_; }
void reset()
{ count_ = zero(T_resulttype()); }
void reset(T_resulttype initialValue)
{ count_ = initialValue; }
static const char* name()
{ return "count"; }
protected:
T_resulttype count_;
};
template<class P_sourcetype>
class ReduceAny {
public:
typedef P_sourcetype T_sourcetype;
typedef _bz_bool T_resulttype;
typedef T_resulttype T_numtype;
enum { needIndex = 0, canProvideInitialValue = 0 };
ReduceAny()
{ reset(); }
ReduceAny(T_resulttype initialValue)
{
reset(initialValue);
}
bool operator()(T_sourcetype x)
{
if (x)
{
any_ = _bz_true;
return false;
}
return true;
}
bool operator()(T_sourcetype x, int)
{
if (x)
{
any_ = _bz_true;
return false;
}
return true;
}
T_resulttype result(int)
{ return any_; }
void reset()
{ any_ = _bz_false; }
void reset(T_resulttype)
{
BZPRECHECK(0, "Provided initial value for ReduceAny");
reset();
}
static const char* name()
{ return "any"; }
protected:
T_resulttype any_;
};
template<class P_sourcetype>
class ReduceAll {
public:
typedef P_sourcetype T_sourcetype;
typedef _bz_bool T_resulttype;
typedef T_resulttype T_numtype;
enum { needIndex = 0, canProvideInitialValue = 0 };
ReduceAll()
{ reset(); }
ReduceAll(T_resulttype initialValue)
{
reset(initialValue);
}
bool operator()(T_sourcetype x)
{
if (!_bz_bool(x))
{
all_ = _bz_false;
return false;
}
else
return true;
}
bool operator()(T_sourcetype x, int)
{
if (!_bz_bool(x))
{
all_ = _bz_false;
return false;
}
else
return true;
}
T_resulttype result(int)
{ return all_; }
void reset()
{ all_ = _bz_true; }
void reset(T_resulttype)
{
BZPRECHECK(0, "Provided initial value for ReduceAll");
reset();
}
static const char* name()
{ return "all"; }
protected:
T_resulttype all_;
};
BZ_NAMESPACE_END
#endif // BZ_REDUCE_H
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -