void Weave::_calculate(const Indicator& ind) { size_t total = ind.size(); if (m_result_num != 0 && total != size()) { HKU_ERROR("ind's size must be equal weave's size! [Weave::_calculate]"); return; } if (total == 0) { return; } size_t old_m_result_num = m_result_num; m_result_num = ind.getResultNumber() + m_result_num; if (m_result_num > MAX_RESULT_NUM) { HKU_WARN("Weave only can contains " << MAX_RESULT_NUM << "reult_num! [Weave::_calculate]"); m_result_num = MAX_RESULT_NUM; } if (m_discard < ind.discard()) { m_discard = ind.discard(); } price_t null_price = Null<price_t>(); for (size_t i = old_m_result_num; i < m_result_num; ++i) { m_pBuffer[i] = new PriceList(total, null_price); for (size_t j = m_discard; j < total; ++j) { (*m_pBuffer[i])[j] = ind.get(j, i-old_m_result_num); } } }
void IPriceList::_calculate(const Indicator& data) { //如果在叶子节点,直接取自身的data参数 if (isLeaf()) { PriceList x = getParam<PriceList>("data"); int discard = getParam<int>("discard"); size_t total = x.size(); _readyBuffer(total, 1); //更新抛弃数量 m_discard = discard > total ? total : discard; for (size_t i = m_discard; i < total; ++i) { _set(x[i], i); } return; } //不在叶子节点上,则忽略本身的data参数,认为其输入实际为函数入参中的data int result_index = getParam<int>("result_index"); if (result_index < 0 || result_index >= data.getResultNumber()) { HKU_ERROR("result_index out of range! [IPriceList::IPriceList]"); return; } size_t total = data.size(); _readyBuffer(total, 1); for (size_t i = data.discard(); i < total; ++i) { _set(data.get(i, result_index), i); } //更新抛弃数量 m_discard = data.discard(); }