1/*
2 * Copyright (c) 2011-2014, Intel Corporation
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without modification,
6 * are permitted provided that the following conditions are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright notice, this
9 * list of conditions and the following disclaimer.
10 *
11 * 2. Redistributions in binary form must reproduce the above copyright notice,
12 * this list of conditions and the following disclaimer in the documentation and/or
13 * other materials provided with the distribution.
14 *
15 * 3. Neither the name of the copyright holder nor the names of its contributors
16 * may be used to endorse or promote products derived from this software without
17 * specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
23 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
26 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30#pragma once
31
32#include "Parameter.h"
33
34class CArrayParameter : public CParameter
35{
36public:
37    CArrayParameter(const std::string &strName, const CTypeElement *pTypeElement);
38
39    // Instantiation, allocation
40    virtual size_t getFootPrint() const;
41
42    /// Value access
43    using CBaseParameter::access;
44    bool access(std::vector<bool> &abValues, bool bSet,
45                CParameterAccessContext &parameterAccessContext) const override final;
46    bool access(std::vector<uint32_t> &auiValues, bool bSet,
47                CParameterAccessContext &parameterAccessContext) const override final;
48    bool access(std::vector<int32_t> &aiValues, bool bSet,
49                CParameterAccessContext &parameterAccessContext) const override final;
50    bool access(std::vector<double> &adValues, bool bSet,
51                CParameterAccessContext &parameterAccessContext) const override final;
52    bool access(std::vector<std::string> &astrValues, bool bSet,
53                CParameterAccessContext &parameterAccessContext) const override final;
54
55protected:
56    // User set/get
57    virtual bool accessValue(CPathNavigator &pathNavigator, std::string &strValue, bool bSet,
58                             CParameterAccessContext &parameterAccessContext) const;
59    // Used for simulation and virtual subsystems
60    virtual void setDefaultValues(CParameterAccessContext &parameterAccessContext) const;
61
62    // Element properties
63    virtual void showProperties(std::string &strResult) const;
64
65private:
66    // Array length
67    size_t getArrayLength() const;
68    // Common set value processing
69    bool setValues(size_t uiStartIndex, size_t offset, const std::string &strValue,
70                   CParameterAccessContext &parameterAccessContext) const;
71    // Log / get values common
72    std::string getValues(size_t baseOffset, CParameterAccessContext &parameterAccessContext) const;
73    std::string logValue(CParameterAccessContext &context) const override;
74    // Index retrieval from user set/get request
75    bool getIndex(CPathNavigator &pathNavigator, size_t &index,
76                  CParameterAccessContext &parameterAccessContext) const;
77
78    /** Access whole array.
79     *
80     * @param[in] offset Offset of the array in the context blackboard.
81     * @{
82     */
83    bool doSetValue(const std::string &strValue, size_t offset,
84                    CParameterAccessContext &parameterAccessContext) const override;
85    void doGetValue(std::string &strValue, size_t offset,
86                    CParameterAccessContext &parameterAccessContext) const override;
87    /** @} */
88
89    /// Value access
90    // Generic Access
91    template <typename type>
92    bool accessValues(std::vector<type> &values, bool bSet,
93                      CParameterAccessContext &parameterAccessContext) const;
94    template <typename type>
95    bool setValues(const std::vector<type> &values,
96                   CParameterAccessContext &parameterAccessContext) const;
97    template <typename type>
98    bool getValues(std::vector<type> &values,
99                   CParameterAccessContext &parameterAccessContext) const;
100    template <typename type>
101    bool doSet(type value, size_t offset, CParameterAccessContext &parameterAccessContext) const;
102    template <typename type>
103    bool doGet(type &value, size_t offset, CParameterAccessContext &parameterAccessContext) const;
104};
105