1 /*
2  * Copyright (c) 2011-2015, 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 #include "LinearParameterAdaptation.h"
31 #include "Utility.h"
32 
33 #define base CParameterAdaptation
34 
35 using std::string;
36 
CLinearParameterAdaptation()37 CLinearParameterAdaptation::CLinearParameterAdaptation() : base("Linear"), _dSlopeNumerator(1), _dSlopeDenominator(1)
38 {
39 }
40 
CLinearParameterAdaptation(const string & strType)41 CLinearParameterAdaptation::CLinearParameterAdaptation(const string& strType) :
42     base(strType), _dSlopeNumerator(1), _dSlopeDenominator(1)
43 {
44 }
45 
46 // Element properties
showProperties(string & strResult) const47 void CLinearParameterAdaptation::showProperties(string& strResult) const
48 {
49     base::showProperties(strResult);
50 
51     // SlopeNumerator
52     strResult += " - SlopeNumerator: ";
53     strResult += CUtility::toString(_dSlopeNumerator);
54     strResult += "\n";
55 
56     // SlopeDenominator
57     strResult += " - SlopeDenominator: ";
58     strResult += CUtility::toString(_dSlopeDenominator);
59     strResult += "\n";
60 }
61 
62 // From IXmlSink
fromXml(const CXmlElement & xmlElement,CXmlSerializingContext & serializingContext)63 bool CLinearParameterAdaptation::fromXml(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext)
64 {
65     // Get SlopeNumerator
66     if (xmlElement.hasAttribute("SlopeNumerator")) {
67 
68         _dSlopeNumerator = xmlElement.getAttributeDouble("SlopeNumerator");
69 
70     } else {
71         // Default
72         _dSlopeNumerator = 1;
73     }
74     // Get SlopeDenominator
75     if (xmlElement.hasAttribute("SlopeDenominator")) {
76 
77         _dSlopeDenominator = xmlElement.getAttributeDouble("SlopeDenominator");
78 
79         // Avoid by 0 division errors
80         if (_dSlopeDenominator == 0) {
81 
82             serializingContext.setError("SlopeDenominator attribute can't be 0 on element" + xmlElement.getPath());
83 
84             return false;
85         }
86 
87     } else {
88         // Default
89         _dSlopeDenominator = 1;
90     }
91 
92     // Base
93     return base::fromXml(xmlElement, serializingContext);
94 }
95 
96 // Conversions
fromUserValue(double dValue) const97 int64_t CLinearParameterAdaptation::fromUserValue(double dValue) const
98 {
99     return base::fromUserValue(dValue * _dSlopeNumerator / _dSlopeDenominator);
100 }
101 
toUserValue(int64_t iValue) const102 double CLinearParameterAdaptation::toUserValue(int64_t iValue) const
103 {
104     return base::toUserValue(iValue) * _dSlopeDenominator / _dSlopeNumerator;
105 }
106