Skip to content
This repository was archived by the owner on Aug 5, 2022. It is now read-only.

Commit a99e07d

Browse files
authored
Merge pull request #376 from dawagner/integerparam-template
Templatize IntegerParameterType Make IntegerParameterType template over the size and signedness - simplifies the implementation and makes the code more robust.
2 parents b871a8f + 9199e04 commit a99e07d

File tree

12 files changed

+715
-523
lines changed

12 files changed

+715
-523
lines changed
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
/*
2+
* Copyright (c) 2016, 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+
31+
#include <sstream>
32+
#include <iomanip>
33+
34+
#include "BaseIntegerParameterType.h"
35+
#include "ParameterAccessContext.h"
36+
#include "ParameterAdaptation.h"
37+
38+
// Kind
39+
std::string CBaseIntegerParameterType::getKind() const
40+
{
41+
return "IntegerParameter";
42+
}
43+
44+
// Deal with adaption node
45+
bool CBaseIntegerParameterType::childrenAreDynamic() const
46+
{
47+
return true;
48+
}
49+
50+
bool CBaseIntegerParameterType::fromBlackboard(uint32_t &uiUserValue, uint32_t uiValue,
51+
CParameterAccessContext & /*ctx*/) const
52+
{
53+
// Do assign
54+
uiUserValue = uiValue;
55+
56+
return true;
57+
}
58+
bool CBaseIntegerParameterType::fromBlackboard(int32_t &iUserValue, uint32_t uiValue,
59+
CParameterAccessContext & /*ctx*/) const
60+
{
61+
int32_t iValue = uiValue;
62+
63+
// Sign extend
64+
signExtend(iValue);
65+
66+
// Do assign
67+
iUserValue = iValue;
68+
69+
return true;
70+
}
71+
// Adaptation element retrieval
72+
const CParameterAdaptation *CBaseIntegerParameterType::getParameterAdaptation() const
73+
{
74+
return static_cast<const CParameterAdaptation *>(findChildOfKind("Adaptation"));
75+
}
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
/*
2+
* Copyright (c) 2016, 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 "ParameterType.h"
33+
34+
#include <string>
35+
36+
class CParameterAdaptation;
37+
38+
/** Base class for CIntegerParameterType
39+
*
40+
* CIntegerParameterType is template - this class Contains the parts that do
41+
* not depend on template arguments in order to make the implementation more
42+
* consise.
43+
*/
44+
class CBaseIntegerParameterType : public CParameterType
45+
{
46+
public:
47+
CBaseIntegerParameterType(const std::string &name) : CParameterType(name){};
48+
49+
// CElement
50+
std::string getKind() const override;
51+
52+
bool fromBlackboard(uint32_t &uiUserValue, uint32_t uiValue,
53+
CParameterAccessContext &parameterAccessContext) const override;
54+
bool fromBlackboard(int32_t &iUserValue, uint32_t uiValue,
55+
CParameterAccessContext &parameterAccessContext) const override;
56+
bool fromBlackboard(double &dUserValue, uint32_t uiValue,
57+
CParameterAccessContext &parameterAccessContext) const override
58+
{
59+
return CParameterType::fromBlackboard(dUserValue, uiValue, parameterAccessContext);
60+
}
61+
bool fromBlackboard(std::string &strValue, const uint32_t &value,
62+
CParameterAccessContext &parameterAccessContext) const override = 0;
63+
64+
protected:
65+
// Adaptation element retrieval
66+
const CParameterAdaptation *getParameterAdaptation() const;
67+
68+
private:
69+
// Returns true if children dynamic creation is to be dealt with
70+
bool childrenAreDynamic() const override;
71+
};

parameter/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ add_library(parameter SHARED
3535
${parameter_OS_SPECIFIC_SRCS}
3636
AreaConfiguration.cpp
3737
ArrayParameter.cpp
38+
BaseIntegerParameterType.cpp
3839
BaseParameter.cpp
3940
BitParameterBlock.cpp
4041
BitParameterBlockType.cpp
@@ -66,7 +67,6 @@ add_library(parameter SHARED
6667
HardwareBackSynchronizer.cpp
6768
InstanceConfigurableElement.cpp
6869
InstanceDefinition.cpp
69-
IntegerParameterType.cpp
7070
LinearParameterAdaptation.cpp
7171
LogarithmicParameterAdaptation.cpp
7272
LoggingElementBuilderTemplate.cpp

parameter/Element.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
#include "XmlElementSerializingContext.h"
3232
#include "ElementLibrary.h"
3333
#include "ErrorContext.hpp"
34+
#include "PfError.hpp"
3435
#include <algorithm>
3536
#include <assert.h>
3637
#include <stdio.h>
@@ -140,8 +141,8 @@ string CElement::logValue(utility::ErrorContext & /*ctx*/) const
140141
}
141142

142143
// From IXmlSink
143-
bool CElement::fromXml(const CXmlElement &xmlElement, CXmlSerializingContext &serializingContext)
144-
{
144+
bool CElement::fromXml(const CXmlElement &xmlElement,
145+
CXmlSerializingContext &serializingContext) try {
145146
xmlElement.getAttribute(gDescriptionPropertyName, _strDescription);
146147

147148
// Propagate through children
@@ -183,6 +184,9 @@ bool CElement::fromXml(const CXmlElement &xmlElement, CXmlSerializingContext &se
183184
}
184185

185186
return true;
187+
} catch (const PfError &e) {
188+
serializingContext.appendLineToError(e.what());
189+
return false;
186190
}
187191

188192
void CElement::childrenToXml(CXmlElement &xmlElement,
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
/*
2+
* Copyright (c) 2016, 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 "ElementBuilder.h"
33+
#include "IntegerParameterType.h"
34+
35+
/** Specialized element builder for IntegerParameterType
36+
*
37+
* Dispatch to the correct template instance according to the signedness and
38+
* size.
39+
*/
40+
class IntegerParameterBuilder : public CElementBuilder
41+
{
42+
public:
43+
CElement *createElement(const CXmlElement &xmlElement) const override
44+
{
45+
size_t sizeInBits;
46+
sizeInBits = xmlElement.getAttribute("Size", sizeInBits) ? sizeInBits : 32;
47+
48+
bool isSigned = false;
49+
xmlElement.getAttribute("Signed", isSigned);
50+
51+
auto name = xmlElement.getNameAttribute();
52+
53+
switch (sizeInBits) {
54+
case 8:
55+
if (isSigned) {
56+
return new CIntegerParameterType<true, 8>(name);
57+
}
58+
return new CIntegerParameterType<false, 8>(name);
59+
case 16:
60+
if (isSigned) {
61+
return new CIntegerParameterType<true, 16>(name);
62+
}
63+
return new CIntegerParameterType<false, 16>(name);
64+
case 32:
65+
if (isSigned) {
66+
return new CIntegerParameterType<true, 32>(name);
67+
}
68+
return new CIntegerParameterType<false, 32>(name);
69+
default:
70+
return nullptr;
71+
}
72+
}
73+
};

0 commit comments

Comments
 (0)