Own fork of MbedSmartRest

Dependents:   MbedSmartRestMain MbedSmartRestMain

Fork of MbedSmartRest by Cumulocity Official

Committer:
xinlei
Date:
Tue Mar 03 14:51:54 2015 +0000
Revision:
16:81f9e39914cf
Parent:
11:e1bee9a77652
Child:
19:81dfc04ce0bb
Set all destructors to be virtual.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Cumulocity 0:099f76422485 1 /*
Cumulocity 0:099f76422485 2 * Aggregator.h
Cumulocity 0:099f76422485 3 *
Cumulocity 0:099f76422485 4 * Created on: Nov 1, 2013
Cumulocity 0:099f76422485 5 * * Authors: Vincent Wochnik <v.wochnik@gmail.com>
Cumulocity 0:099f76422485 6 *
Cumulocity 0:099f76422485 7 * Copyright (c) 2013 Cumulocity GmbH
Cumulocity 0:099f76422485 8 *
Cumulocity 0:099f76422485 9 * Permission is hereby granted, free of charge, to any person obtaining
Cumulocity 0:099f76422485 10 * a copy of this software and associated documentation files (the
Cumulocity 0:099f76422485 11 * "Software"), to deal in the Software without restriction, including
Cumulocity 0:099f76422485 12 * without limitation the rights to use, copy, modify, merge, publish,
Cumulocity 0:099f76422485 13 * distribute, sublicense, and/or sell copies of the Software, and to
Cumulocity 0:099f76422485 14 * permit persons to whom the Software is furnished to do so, subject to
Cumulocity 0:099f76422485 15 * the following conditions:
Cumulocity 0:099f76422485 16 *
Cumulocity 0:099f76422485 17 * The above copyright notice and this permission notice shall be
Cumulocity 0:099f76422485 18 * included in all copies or substantial portions of the Software.
Cumulocity 0:099f76422485 19 *
Cumulocity 0:099f76422485 20 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
Cumulocity 0:099f76422485 21 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
Cumulocity 0:099f76422485 22 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
Cumulocity 0:099f76422485 23 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
Cumulocity 0:099f76422485 24 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
Cumulocity 0:099f76422485 25 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
Cumulocity 0:099f76422485 26 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Cumulocity 0:099f76422485 27 */
Cumulocity 0:099f76422485 28
Cumulocity 0:099f76422485 29 #ifndef AGGREGATOR_H
Cumulocity 0:099f76422485 30 #define AGGREGATOR_H
Cumulocity 0:099f76422485 31
Cumulocity 0:099f76422485 32 #include "config.h"
Cumulocity 0:099f76422485 33 #include <stddef.h>
Cumulocity 0:099f76422485 34 #include "DataGenerator.h"
Cumulocity 5:2b74510900da 35 #include "Record.h"
Cumulocity 0:099f76422485 36
Cumulocity 0:099f76422485 37 #ifndef SMARTREST_AGGREGATOR_INITIAL_CAPACITY
Cumulocity 0:099f76422485 38 #define SMARTREST_AGGREGATOR_INITIAL_CAPACITY 50
Cumulocity 0:099f76422485 39 #endif
Cumulocity 0:099f76422485 40 #ifndef SMARTREST_AGGREGATOR_MEMORY_INCREMENT
Cumulocity 0:099f76422485 41 #define SMARTREST_AGGREGATOR_MEMORY_INCREMENT 25
Cumulocity 0:099f76422485 42 #endif
Cumulocity 0:099f76422485 43 //#define SMARTREST_AGGREGATOR_FIXED_SIZE 100
Cumulocity 0:099f76422485 44
Cumulocity 0:099f76422485 45 /**
Cumulocity 5:2b74510900da 46 * An aggregator of records.
Cumulocity 0:099f76422485 47 *
Cumulocity 0:099f76422485 48 * Example:
Cumulocity 0:099f76422485 49 * @code
Cumulocity 0:099f76422485 50 * // Given: A concrete SmartRest implementation.
Cumulocity 0:099f76422485 51 * SmartRest client;
Cumulocity 0:099f76422485 52 *
Cumulocity 0:099f76422485 53 * // sets up a growing aggregator which copies all added objects
Cumulocity 0:099f76422485 54 * // to the heap
Cumulocity 0:099f76422485 55 * Aggregator buffer(25, true, true);
Cumulocity 0:099f76422485 56 *
Cumulocity 0:099f76422485 57 * // random data collection
Cumulocity 0:099f76422485 58 * for (uint8_t i = 0; i < 32; ++i) {
Cumulocity 0:099f76422485 59 * // Note: ComposedRecord is not copying any values into the heap
Cumulocity 0:099f76422485 60 * // because the availability of its values in guaranteed during the
Cumulocity 0:099f76422485 61 * // instance's lifetime.
Cumulocity 0:099f76422485 62 * ComposedRecord record(false);
Cumulocity 0:099f76422485 63 *
Cumulocity 0:099f76422485 64 * CharValue msgId(100);
Cumulocity 0:099f76422485 65 * IntegerValue number(i);
Cumulocity 0:099f76422485 66 * record.add(msgId).add(number);
Cumulocity 0:099f76422485 67 *
Cumulocity 0:099f76422485 68 * // Note: ComposedRecord is now cloned into the heap to extend its
Cumulocity 0:099f76422485 69 * // lifetime beyond this code block.
Cumulocity 0:099f76422485 70 * buffer.add(record);
Cumulocity 0:099f76422485 71 * }
Cumulocity 0:099f76422485 72 *
Cumulocity 0:099f76422485 73 * // send the bulk request
Cumulocity 0:099f76422485 74 * uint8_t ret = client.send(buffer);
Cumulocity 0:099f76422485 75 * if (ret != SMARTREST_SUCCESS) {
Cumulocity 0:099f76422485 76 * // error handling
Cumulocity 0:099f76422485 77 * }
Cumulocity 0:099f76422485 78 * @encode
Cumulocity 0:099f76422485 79 */
Cumulocity 0:099f76422485 80 class Aggregator : public DataGenerator
Cumulocity 0:099f76422485 81 {
Cumulocity 11:e1bee9a77652 82 public:
Cumulocity 11:e1bee9a77652 83 #ifndef SMARTREST_AGGREGATOR_FIXED_SIZE
Cumulocity 11:e1bee9a77652 84 /**
Cumulocity 11:e1bee9a77652 85 * Creates a new Aggregator instance.
Cumulocity 11:e1bee9a77652 86 * @param capacity the initial capacity of the instance
Cumulocity 11:e1bee9a77652 87 * @param growing specifies the capability of this instance to grow
Cumulocity 11:e1bee9a77652 88 * @param managed specifies whether internal memory management shall be
Cumulocity 11:e1bee9a77652 89 * used. If true, all added records will be copied to
Cumulocity 11:e1bee9a77652 90 * the heap and freed accordingly.
Cumulocity 11:e1bee9a77652 91 */
Cumulocity 11:e1bee9a77652 92 Aggregator(size_t = SMARTREST_AGGREGATOR_INITIAL_CAPACITY, bool = true, bool = false);
Cumulocity 11:e1bee9a77652 93 #else
Cumulocity 11:e1bee9a77652 94 /**
Cumulocity 11:e1bee9a77652 95 * Creates a new Aggregator instance.
Cumulocity 11:e1bee9a77652 96 * @param managed specifies whether internal memory management shall be
Cumulocity 11:e1bee9a77652 97 * used. If true, all added records will be copied to
Cumulocity 11:e1bee9a77652 98 * the heap and freed accordingly.
Cumulocity 11:e1bee9a77652 99 */
Cumulocity 11:e1bee9a77652 100 Aggregator(bool = false);
Cumulocity 11:e1bee9a77652 101 #endif
xinlei 16:81f9e39914cf 102 virtual ~Aggregator();
Cumulocity 0:099f76422485 103
Cumulocity 11:e1bee9a77652 104 /**
Cumulocity 11:e1bee9a77652 105 * Adds a record to the aggregator.
Cumulocity 11:e1bee9a77652 106 * @param record the record to add
Cumulocity 11:e1bee9a77652 107 * @return true if added, false otherwise.
Cumulocity 11:e1bee9a77652 108 */
Cumulocity 11:e1bee9a77652 109 bool add(const Record&);
Cumulocity 5:2b74510900da 110
Cumulocity 11:e1bee9a77652 111 /**
Cumulocity 11:e1bee9a77652 112 * Retrieves the nth record from the aggregator.
Cumulocity 11:e1bee9a77652 113 * @param index the index of the nth element to retrieve
Cumulocity 11:e1bee9a77652 114 */
Cumulocity 11:e1bee9a77652 115 const Record& get(size_t) const;
Cumulocity 0:099f76422485 116
Cumulocity 11:e1bee9a77652 117 /**
Cumulocity 11:e1bee9a77652 118 * Clears the aggregator. The capacity will shrink to it's initial
Cumulocity 11:e1bee9a77652 119 * size.
Cumulocity 11:e1bee9a77652 120 */
Cumulocity 11:e1bee9a77652 121 void clear();
Cumulocity 0:099f76422485 122
Cumulocity 11:e1bee9a77652 123 /**
Cumulocity 11:e1bee9a77652 124 * Returns the number of records aggregated by this instance.
Cumulocity 11:e1bee9a77652 125 * @return the number of records aggregated
Cumulocity 11:e1bee9a77652 126 */
Cumulocity 11:e1bee9a77652 127 size_t length() const;
Cumulocity 0:099f76422485 128
Cumulocity 11:e1bee9a77652 129 /**
Cumulocity 11:e1bee9a77652 130 * Returns whether the aggregator is full. If growing, this will
Cumulocity 11:e1bee9a77652 131 * always return false.
Cumulocity 11:e1bee9a77652 132 * @return whether the aggregator is full
Cumulocity 11:e1bee9a77652 133 */
Cumulocity 11:e1bee9a77652 134 bool full() const;
Cumulocity 0:099f76422485 135
Cumulocity 11:e1bee9a77652 136 /**
Cumulocity 11:e1bee9a77652 137 * Returns the capacity of the aggregator. This will always return zero
Cumulocity 11:e1bee9a77652 138 * if the aggregator is growing.
Cumulocity 11:e1bee9a77652 139 */
Cumulocity 11:e1bee9a77652 140 size_t capacity() const;
Cumulocity 0:099f76422485 141
Cumulocity 11:e1bee9a77652 142 /**
Cumulocity 11:e1bee9a77652 143 * Returns whether this aggregator is using internal memory management.
Cumulocity 11:e1bee9a77652 144 * @return whether internal memory management is being used
Cumulocity 11:e1bee9a77652 145 */
Cumulocity 11:e1bee9a77652 146 bool managed() const;
Cumulocity 5:2b74510900da 147
Cumulocity 11:e1bee9a77652 148 size_t writeTo(AbstractDataSink&) const;
Cumulocity 11:e1bee9a77652 149 size_t writtenLength() const;
Cumulocity 11:e1bee9a77652 150 Aggregator* copy() const;
Cumulocity 0:099f76422485 151
Cumulocity 11:e1bee9a77652 152 private:
Cumulocity 11:e1bee9a77652 153 #ifdef SMARTREST_AGGREGATOR_FIXED_SIZE
Cumulocity 11:e1bee9a77652 154 const Record *_list[SMARTREST_AGGREGATOR_FIXED_SIZE];
Cumulocity 11:e1bee9a77652 155 #else
Cumulocity 11:e1bee9a77652 156 const Record **_list;
Cumulocity 11:e1bee9a77652 157 #endif
Cumulocity 11:e1bee9a77652 158 size_t _length;
Cumulocity 11:e1bee9a77652 159 #ifndef SMARTREST_AGGREGATOR_FIXED_SIZE
Cumulocity 11:e1bee9a77652 160 size_t _capacity, _initial;
Cumulocity 11:e1bee9a77652 161 bool _growing;
Cumulocity 11:e1bee9a77652 162 #endif
Cumulocity 11:e1bee9a77652 163 bool _managed;
Cumulocity 0:099f76422485 164 };
Cumulocity 0:099f76422485 165
Cumulocity 0:099f76422485 166 #endif