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 "ParameterBlackboard.h"
31 #include "Iterator.hpp"
32 #include "AlwaysAssert.hpp"
33 #include <algorithm>
34 
35 // Size
setSize(size_t size)36 void CParameterBlackboard::setSize(size_t size)
37 {
38     mBlackboard.resize(size);
39 }
40 
getSize() const41 size_t CParameterBlackboard::getSize() const
42 {
43     return mBlackboard.size();
44 }
45 
46 // Single parameter access
writeInteger(const void * pvSrcData,size_t size,size_t offset)47 void CParameterBlackboard::writeInteger(const void *pvSrcData, size_t size, size_t offset)
48 {
49     assertValidAccess(offset, size);
50 
51     auto first = MAKE_ARRAY_ITERATOR(static_cast<const uint8_t *>(pvSrcData), size);
52     auto last = first + size;
53     auto dest_first = atOffset(offset);
54 
55     std::copy(first, last, dest_first);
56 }
57 
readInteger(void * pvDstData,size_t size,size_t offset) const58 void CParameterBlackboard::readInteger(void *pvDstData, size_t size, size_t offset) const
59 {
60     assertValidAccess(offset, size);
61 
62     auto first = atOffset(offset);
63     auto last = first + size;
64     auto dest_first = MAKE_ARRAY_ITERATOR(static_cast<uint8_t *>(pvDstData), size);
65 
66     std::copy(first, last, dest_first);
67 }
68 
writeString(const std::string & input,size_t offset)69 void CParameterBlackboard::writeString(const std::string &input, size_t offset)
70 {
71     assertValidAccess(offset, input.size() + 1);
72 
73     auto dest_last = std::copy(begin(input), end(input), atOffset(offset));
74     *dest_last = '\0';
75 }
76 
readString(std::string & output,size_t offset) const77 void CParameterBlackboard::readString(std::string &output, size_t offset) const
78 {
79     // As the string is null terminated in the blackboard,
80     // the size that will be read is not known. (>= 1)
81     assertValidAccess(offset, sizeof('\0'));
82 
83     // Get the pointer to the null terminated string
84     const uint8_t *first = &mBlackboard[offset];
85     output = reinterpret_cast<const char *>(first);
86 }
87 
writeBuffer(const void * pvSrcData,size_t size,size_t offset)88 void CParameterBlackboard::writeBuffer(const void *pvSrcData, size_t size, size_t offset)
89 {
90     writeInteger(pvSrcData, size, offset);
91 }
readBuffer(void * pvDstData,size_t size,size_t offset) const92 void CParameterBlackboard::readBuffer(void *pvDstData, size_t size, size_t offset) const
93 {
94     readInteger(pvDstData, size, offset);
95 }
96 
97 // Element access
writeBytes(const std::vector<uint8_t> & bytes,size_t offset)98 void CParameterBlackboard::writeBytes(const std::vector<uint8_t> &bytes, size_t offset)
99 {
100     assertValidAccess(offset, bytes.size());
101 
102     std::copy(begin(bytes), end(bytes), atOffset(offset));
103 }
104 
readBytes(std::vector<uint8_t> & bytes,size_t offset) const105 void CParameterBlackboard::readBytes(std::vector<uint8_t> &bytes, size_t offset) const
106 {
107     assertValidAccess(offset, bytes.size());
108 
109     std::copy_n(atOffset(offset), bytes.size(), begin(bytes));
110 }
111 
112 // Access from/to subsystems
getLocation(size_t offset)113 uint8_t *CParameterBlackboard::getLocation(size_t offset)
114 {
115     assertValidAccess(offset, 1);
116     return &mBlackboard[offset];
117 }
118 
119 // Configuration handling
restoreFrom(const CParameterBlackboard * pFromBlackboard,size_t offset)120 void CParameterBlackboard::restoreFrom(const CParameterBlackboard *pFromBlackboard, size_t offset)
121 {
122     const auto &fromBB = pFromBlackboard->mBlackboard;
123     assertValidAccess(offset, fromBB.size());
124     std::copy(begin(fromBB), end(fromBB), atOffset(offset));
125 }
126 
saveTo(CParameterBlackboard * pToBlackboard,size_t offset) const127 void CParameterBlackboard::saveTo(CParameterBlackboard *pToBlackboard, size_t offset) const
128 {
129     auto &toBB = pToBlackboard->mBlackboard;
130     assertValidAccess(offset, toBB.size());
131     std::copy_n(atOffset(offset), toBB.size(), begin(toBB));
132 }
133 
assertValidAccess(size_t offset,size_t size) const134 void CParameterBlackboard::assertValidAccess(size_t offset, size_t size) const
135 {
136     ALWAYS_ASSERT(offset + size <= getSize(),
137                   "Invalid data size access: offset=" << offset << " size=" << size
138                                                       << "reference size=" << getSize());
139 }
140