@@ -280,7 +280,8 @@ void IndicatorImp::setContext(const KData &k) {
280280 getAllSubNodes (nodes);
281281 if (ms_enable_increment_calculate) {
282282 for (const auto &node : nodes) {
283- if (!node->m_need_calculate && !node->supportIncrementCalculate ()) {
283+ if (!node->m_need_calculate && ((node->m_optype == LEAF || node->m_optype == OP) &&
284+ !node->supportIncrementCalculate ())) {
284285 node->_clearBuffer ();
285286 }
286287 }
@@ -877,13 +878,12 @@ bool IndicatorImp::increment_execute_leaf_or_op(const Indicator &ind) {
877878 return false ;
878879 }
879880
880- for (size_t r = 0 ; r < m_result_num; ++r) {
881- if (m_pBuffer[r] == nullptr ) {
882- return false ;
881+ if (copy_len > 0 ) {
882+ for (size_t r = 0 ; r < m_result_num; ++r) {
883+ m_pBuffer[r]->resize (total, Null<value_t >());
884+ auto *dst = this ->data (r);
885+ memmove (dst, dst + copy_start_pos, sizeof (value_t ) * (copy_len));
883886 }
884- m_pBuffer[r]->resize (total, Null<value_t >());
885- auto *dst = this ->data (r);
886- memmove (dst, dst + copy_start_pos, sizeof (value_t ) * (copy_len));
887887 }
888888
889889 if (start_pos < m_discard) {
@@ -1054,35 +1054,13 @@ size_t IndicatorImp::increment_execute() {
10541054 return null_pos;
10551055 }
10561056
1057- if (copy_start_pos < m_discard) {
1058- size_t old_discard = m_discard;
1059- m_discard = m_discard - copy_start_pos;
1060- copy_start_pos = old_discard;
1061- copy_len = m_old_context.size () - copy_start_pos;
1062- for (size_t r = 0 ; r < m_result_num; ++r) {
1063- if (m_pBuffer[r] == nullptr ) {
1064- return false ;
1065- }
1066- m_pBuffer[r]->resize (total, Null<value_t >());
1067- auto *dst = this ->data (r);
1068- memmove (dst + m_discard, dst + copy_start_pos, sizeof (value_t ) * (copy_len));
1069- }
1070- } else {
1071- for (size_t r = 0 ; r < m_result_num; ++r) {
1072- if (m_pBuffer[r] == nullptr ) {
1073- return false ;
1074- }
1075- m_pBuffer[r]->resize (total, Null<value_t >());
1076- auto *dst = this ->data (r);
1077- memmove (dst, dst + copy_start_pos, sizeof (value_t ) * (copy_len));
1078- }
1079- }
1080-
1081- if (start_pos < m_discard) {
1082- start_pos = m_discard;
1057+ for (size_t r = 0 ; r < m_result_num; ++r) {
1058+ HKU_ASSERT (m_pBuffer[r] != nullptr );
1059+ m_pBuffer[r]->resize (total, Null<value_t >());
1060+ auto *dst = this ->data (r);
1061+ memmove (dst, dst + copy_start_pos, sizeof (value_t ) * (copy_len));
10831062 }
10841063
1085- _update_discard ();
10861064 return start_pos;
10871065}
10881066
@@ -1846,35 +1824,12 @@ size_t IndicatorImp::increment_execute_if() {
18461824 return null_pos;
18471825 }
18481826
1849- if (copy_start_pos < m_discard) {
1850- size_t old_discard = m_discard;
1851- m_discard = m_discard - copy_start_pos;
1852- copy_start_pos = old_discard;
1853- copy_len = m_old_context.size () - copy_start_pos;
1854- for (size_t r = 0 ; r < m_result_num; ++r) {
1855- if (m_pBuffer[r] == nullptr ) {
1856- return false ;
1857- }
1858- m_pBuffer[r]->resize (total, Null<value_t >());
1859- auto *dst = this ->data (r);
1860- memmove (dst + m_discard, dst + copy_start_pos, sizeof (value_t ) * (copy_len));
1861- }
1862- } else {
1863- for (size_t r = 0 ; r < m_result_num; ++r) {
1864- if (m_pBuffer[r] == nullptr ) {
1865- return false ;
1866- }
1867- m_pBuffer[r]->resize (total, Null<value_t >());
1868- auto *dst = this ->data (r);
1869- memmove (dst, dst + copy_start_pos, sizeof (value_t ) * (copy_len));
1870- }
1871- }
1872-
1873- if (start_pos < m_discard) {
1874- start_pos = m_discard;
1827+ for (size_t r = 0 ; r < m_result_num; ++r) {
1828+ m_pBuffer[r]->resize (total, Null<value_t >());
1829+ auto *dst = this ->data (r);
1830+ memmove (dst, dst + copy_start_pos, sizeof (value_t ) * (copy_len));
18751831 }
18761832
1877- _update_discard ();
18781833 return start_pos;
18791834}
18801835
@@ -1918,8 +1873,9 @@ void IndicatorImp::execute_if() {
19181873 if (start_pos == Null<size_t >()) {
19191874 size_t result_number = std::min (minp->getResultNumber (), maxp->getResultNumber ());
19201875 _readyBuffer (total, result_number);
1921- } else if (start_pos > discard) {
1922- discard = start_pos;
1876+ start_pos = discard;
1877+ } else if (start_pos < discard) {
1878+ start_pos = discard;
19231879 }
19241880
19251881 setDiscard (discard);
@@ -1929,7 +1885,7 @@ void IndicatorImp::execute_if() {
19291885 auto *three = m_three->data (0 );
19301886 for (size_t r = 0 ; r < m_result_num; ++r) {
19311887 auto *dst = this ->data (r);
1932- for (size_t i = discard ; i < total; ++i) {
1888+ for (size_t i = start_pos ; i < total; ++i) {
19331889 if (three[i - diff_cond] > 0.0 ) {
19341890 dst[i] = left[i - diff_left];
19351891 } else {
@@ -2022,6 +1978,9 @@ void IndicatorImp::_update_discard(bool force) {
20221978 m_discard = discard;
20231979 }
20241980 }
1981+ if (m_discard > total) {
1982+ m_discard = total;
1983+ }
20251984}
20261985
20271986bool IndicatorImp::alike (const IndicatorImp &other) const {
0 commit comments