📄 namedtuple.h
字号:
const std::string& n16 = "Q",
const std::string& n17 = "R",
const std::string& n18 = "S",
const std::string& n19 = "T")
{
if (!_pNames)
{
_pNames = new NameVec;
_pNames->push_back(n0);
_pNames->push_back(n1);
_pNames->push_back(n2);
_pNames->push_back(n3);
_pNames->push_back(n4);
_pNames->push_back(n5);
_pNames->push_back(n6);
_pNames->push_back(n7);
_pNames->push_back(n8);
_pNames->push_back(n9);
_pNames->push_back(n10);
_pNames->push_back(n11);
_pNames->push_back(n12);
_pNames->push_back(n13);
_pNames->push_back(n14);
_pNames->push_back(n15);
_pNames->push_back(n16);
_pNames->push_back(n17);
_pNames->push_back(n18);
_pNames->push_back(n19);
}
}
NameVecPtr _pNames;
};
template<class T0,
class T1,
class T2,
class T3,
class T4,
class T5,
class T6,
class T7,
class T8,
class T9,
class T10,
class T11,
class T12,
class T13,
class T14,
class T15,
class T16,
class T17,
class T18>
struct NamedTuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,NullTypeList>:
public Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18>
{
typedef Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18> TupleType;
typedef typename Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18>::Type Type;
typedef std::vector<std::string> NameVec;
typedef SharedPtr<NameVec> NameVecPtr;
NamedTuple(): _pNames(0)
{
init();
}
NamedTuple(const NameVecPtr& rNames)
{
if (rNames->size() != TupleType::length)
throw InvalidArgumentException("Wrong names vector length.");
_pNames = rNames;
}
NamedTuple(typename TypeWrapper<T0>::CONSTTYPE& t0,
typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2),
typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5),
typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6),
typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8),
typename TypeWrapper<T9>::CONSTTYPE& t9 = POCO_TYPEWRAPPER_DEFAULTVALUE(T9),
typename TypeWrapper<T10>::CONSTTYPE& t10 = POCO_TYPEWRAPPER_DEFAULTVALUE(T10),
typename TypeWrapper<T11>::CONSTTYPE& t11 = POCO_TYPEWRAPPER_DEFAULTVALUE(T11),
typename TypeWrapper<T12>::CONSTTYPE& t12 = POCO_TYPEWRAPPER_DEFAULTVALUE(T12),
typename TypeWrapper<T13>::CONSTTYPE& t13 = POCO_TYPEWRAPPER_DEFAULTVALUE(T13),
typename TypeWrapper<T14>::CONSTTYPE& t14 = POCO_TYPEWRAPPER_DEFAULTVALUE(T14),
typename TypeWrapper<T15>::CONSTTYPE& t15 = POCO_TYPEWRAPPER_DEFAULTVALUE(T15),
typename TypeWrapper<T16>::CONSTTYPE& t16 = POCO_TYPEWRAPPER_DEFAULTVALUE(T16),
typename TypeWrapper<T17>::CONSTTYPE& t17 = POCO_TYPEWRAPPER_DEFAULTVALUE(T17),
typename TypeWrapper<T18>::CONSTTYPE& t18 = POCO_TYPEWRAPPER_DEFAULTVALUE(T18)):
TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17,t18),
_pNames(0)
{
init();
}
NamedTuple(const NameVecPtr& rNames,
typename TypeWrapper<T0>::CONSTTYPE& t0,
typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2),
typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5),
typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6),
typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8),
typename TypeWrapper<T9>::CONSTTYPE& t9 = POCO_TYPEWRAPPER_DEFAULTVALUE(T9),
typename TypeWrapper<T10>::CONSTTYPE& t10 = POCO_TYPEWRAPPER_DEFAULTVALUE(T10),
typename TypeWrapper<T11>::CONSTTYPE& t11 = POCO_TYPEWRAPPER_DEFAULTVALUE(T11),
typename TypeWrapper<T12>::CONSTTYPE& t12 = POCO_TYPEWRAPPER_DEFAULTVALUE(T12),
typename TypeWrapper<T13>::CONSTTYPE& t13 = POCO_TYPEWRAPPER_DEFAULTVALUE(T13),
typename TypeWrapper<T14>::CONSTTYPE& t14 = POCO_TYPEWRAPPER_DEFAULTVALUE(T14),
typename TypeWrapper<T15>::CONSTTYPE& t15 = POCO_TYPEWRAPPER_DEFAULTVALUE(T15),
typename TypeWrapper<T16>::CONSTTYPE& t16 = POCO_TYPEWRAPPER_DEFAULTVALUE(T16),
typename TypeWrapper<T17>::CONSTTYPE& t17 = POCO_TYPEWRAPPER_DEFAULTVALUE(T17),
typename TypeWrapper<T18>::CONSTTYPE& t18 = POCO_TYPEWRAPPER_DEFAULTVALUE(T18)):
TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17,t18)
{
if (rNames->size() != TupleType::length)
throw InvalidArgumentException("Wrong names vector length.");
_pNames = rNames;
}
NamedTuple(const std::string& n0,
typename TypeWrapper<T0>::CONSTTYPE& t0,
const std::string& n1 = "B",
typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
const std::string& n2 = "C",
typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2),
const std::string& n3 = "D",
typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
const std::string& n4 = "E",
typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
const std::string& n5 = "F",
typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5),
const std::string& n6 = "G",
typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6),
const std::string& n7 = "H",
typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
const std::string& n8 = "I",
typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8),
const std::string& n9 = "J",
typename TypeWrapper<T9>::CONSTTYPE& t9 = POCO_TYPEWRAPPER_DEFAULTVALUE(T9),
const std::string& n10 = "K",
typename TypeWrapper<T10>::CONSTTYPE& t10 = POCO_TYPEWRAPPER_DEFAULTVALUE(T10),
const std::string& n11 = "L",
typename TypeWrapper<T11>::CONSTTYPE& t11 = POCO_TYPEWRAPPER_DEFAULTVALUE(T11),
const std::string& n12 = "M",
typename TypeWrapper<T12>::CONSTTYPE& t12 = POCO_TYPEWRAPPER_DEFAULTVALUE(T12),
const std::string& n13 = "N",
typename TypeWrapper<T13>::CONSTTYPE& t13 = POCO_TYPEWRAPPER_DEFAULTVALUE(T13),
const std::string& n14 = "O",
typename TypeWrapper<T14>::CONSTTYPE& t14 = POCO_TYPEWRAPPER_DEFAULTVALUE(T14),
const std::string& n15 = "P",
typename TypeWrapper<T15>::CONSTTYPE& t15 = POCO_TYPEWRAPPER_DEFAULTVALUE(T15),
const std::string& n16 = "Q",
typename TypeWrapper<T16>::CONSTTYPE& t16 = POCO_TYPEWRAPPER_DEFAULTVALUE(T16),
const std::string& n17 = "R",
typename TypeWrapper<T17>::CONSTTYPE& t17 = POCO_TYPEWRAPPER_DEFAULTVALUE(T17),
const std::string& n18 = "S",
typename TypeWrapper<T18>::CONSTTYPE& t18 = POCO_TYPEWRAPPER_DEFAULTVALUE(T18)):
TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17,t18),
_pNames(0)
{
init(n0,n1,n2,n3,n4,n5,n6,n7,n8,n9,n10,n11,n12,n13,n14,n15,n16,n17,n18);
}
DynamicAny get(const std::string& name) const
{
NameVec::const_iterator it = _pNames->begin();
NameVec::const_iterator itEnd = _pNames->end();
for(std::size_t counter = 0; it != itEnd; ++it, ++counter)
{
if (name == *it)
{
switch (counter)
{
case 0: return TupleType::template get<0>();
case 1: return TupleType::template get<1>();
case 2: return TupleType::template get<2>();
case 3: return TupleType::template get<3>();
case 4: return TupleType::template get<4>();
case 5: return TupleType::template get<5>();
case 6: return TupleType::template get<6>();
case 7: return TupleType::template get<7>();
case 8: return TupleType::template get<8>();
case 9: return TupleType::template get<9>();
case 10: return TupleType::template get<10>();
case 11: return TupleType::template get<11>();
case 12: return TupleType::template get<12>();
case 13: return TupleType::template get<13>();
case 14: return TupleType::template get<14>();
case 15: return TupleType::template get<15>();
case 16: return TupleType::template get<16>();
case 17: return TupleType::template get<17>();
case 18: return TupleType::template get<18>();
default: throw RangeException();
}
}
}
throw NotFoundException("Name not found: " + name);
}
DynamicAny operator [] (const std::string& name) const
{
return get(name);
}
template<int N>
typename TypeGetter<N, Type>::ConstHeadType& get() const
{
return TupleType::template get<N>();
}
template<int N>
typename TypeGetter<N, Type>::HeadType& get()
{
return TupleType::template get<N>();
}
template<int N>
void set(typename TypeGetter<N, Type>::ConstHeadType& val)
{
return TupleType::template set<N>(val);
}
const NameVecPtr& names()
{
return _pNames;
}
void setName(std::size_t index, const std::string& name)
{
if (index >= _pNames->size())
throw InvalidArgumentException(format("Invalid index: %z", index));
(*_pNames)[index] = name;
}
const std::string& getName(std::size_t index)
{
if (index >= _pNames->size())
throw InvalidArgumentException(format("Invalid index: %z", index));
return (*_pNames)[index];
}
bool operator == (const NamedTuple& other) const
{
return TupleType(*this) == TupleType(other) && _pNames == other._pNames;
}
bool operator != (const NamedTuple& other) const
{
return !(*this == other);
}
bool operator < (const NamedTuple& other) const
{
TupleType th(*this);
TupleType oth(other);
return (th < oth && _pNames == other._pNames) ||
(th == oth && _pNames < other._pNames) ||
(th < oth && _pNames < other._pNames);
}
private:
void init(const std::string& n0 = "A",
const std::string& n1 = "B",
const std::string& n2 = "C",
const std::string& n3 = "D",
const std::string& n4 = "E",
const std::string& n5 = "F",
const std::string& n6 = "G",
const std::string& n7 = "H",
const std::string& n8 = "I",
const std::string& n9 = "J",
const std::string& n10 = "K",
const std::string& n11 = "L",
const std::string& n12 = "M",
const std::string& n13 = "N",
const std::string& n14 = "O",
const std::string& n15 = "P",
const std::string& n16 = "Q",
const std::string& n17 = "R",
const std::string& n18 = "S")
{
if (!_pNames)
{
_pNames = new NameVec;
_pNames->push_back(n0);
_pNames->push_back(n1);
_pNames->push_back(n2);
_pNames->push_back(n3);
_pNames->push_back(n4);
_pNames->push_back(n5);
_pNames->push_back(n6);
_pNames->push_back(n7);
_pNames->push_back(n8);
_pNames->push_back(n9);
_pNames->push_back(n10);
_pNames->push_back(n11);
_pNames->push_back(n12);
_pNames->push_back(n13);
_pNames->push_back(n14);
_pNames->push_back(n15);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -