incremental_sum.c 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. // SPDX-License-Identifier: GPL-3.0-or-later
  2. #include "incremental_sum.h"
  3. // ----------------------------------------------------------------------------
  4. // incremental sum
  5. struct grouping_incremental_sum {
  6. calculated_number first;
  7. calculated_number last;
  8. size_t count;
  9. };
  10. void grouping_create_incremental_sum(RRDR *r) {
  11. r->internal.grouping_data = callocz(1, sizeof(struct grouping_incremental_sum));
  12. }
  13. // resets when switches dimensions
  14. // so, clear everything to restart
  15. void grouping_reset_incremental_sum(RRDR *r) {
  16. struct grouping_incremental_sum *g = (struct grouping_incremental_sum *)r->internal.grouping_data;
  17. g->first = 0;
  18. g->last = 0;
  19. g->count = 0;
  20. }
  21. void grouping_free_incremental_sum(RRDR *r) {
  22. freez(r->internal.grouping_data);
  23. r->internal.grouping_data = NULL;
  24. }
  25. void grouping_add_incremental_sum(RRDR *r, calculated_number value) {
  26. struct grouping_incremental_sum *g = (struct grouping_incremental_sum *)r->internal.grouping_data;
  27. if(unlikely(!g->count)) {
  28. g->first = value;
  29. g->count++;
  30. }
  31. else {
  32. g->last = value;
  33. g->count++;
  34. }
  35. }
  36. calculated_number grouping_flush_incremental_sum(RRDR *r, RRDR_VALUE_FLAGS *rrdr_value_options_ptr) {
  37. struct grouping_incremental_sum *g = (struct grouping_incremental_sum *)r->internal.grouping_data;
  38. calculated_number value;
  39. if(unlikely(!g->count)) {
  40. value = 0.0;
  41. *rrdr_value_options_ptr |= RRDR_VALUE_EMPTY;
  42. }
  43. else if(unlikely(g->count == 1)) {
  44. value = 0.0;
  45. }
  46. else {
  47. value = g->last - g->first;
  48. }
  49. g->first = 0.0;
  50. g->last = 0.0;
  51. g->count = 0;
  52. return value;
  53. }