104 std::set<size_t> blackList;
105 const std::vector<Argument<Base> >& args = newArray.
getArguments();
106 for (
size_t i = 0; i < args.size(); i++) {
108 if (argOp !=
nullptr && argOp->
getOperationType() == CGOpCode::ArrayElement) {
110 CPPADCG_ASSERT_UNKNOWN(_varId[otherArray] > 0);
111 size_t otherArrayStart = _varId[otherArray] - 1;
112 size_t index = argOp->
getInfo()[0];
113 blackList.insert(otherArrayStart + index);
120 std::map<size_t, size_t>::reverse_iterator it;
121 std::map<size_t, size_t>::reverse_iterator itBestFit = _freeArrayStartSpace.rend();
122 size_t bestCommonValues = 0;
123 for (it = _freeArrayStartSpace.rbegin(); it != _freeArrayStartSpace.rend(); ++it) {
124 size_t start = it->first;
125 size_t end = it->second;
126 size_t space = end - start + 1;
127 if (space < arraySize) {
131 std::set<size_t>::const_iterator itBlack = blackList.lower_bound(start);
132 if (itBlack != blackList.end() && *itBlack <= end) {
137 if (itBestFit == _freeArrayStartSpace.rend()) {
140 size_t bestSpace = itBestFit->second - itBestFit->first + 1;
142 size_t commonVals = 0;
143 for (
size_t i = 0; i < arraySize; i++) {
144 if (isSameArrayElement(_tmpArrayValues[start + i], args[i])) {
149 if (space < bestSpace || commonVals > bestCommonValues) {
152 bestCommonValues = commonVals;
153 if (bestCommonValues == arraySize) {
160 size_t bestStart = (std::numeric_limits<size_t>::max)();
161 if (itBestFit != _freeArrayStartSpace.rend()) {
165 bestStart = itBestFit->first;
166 size_t bestEnd = itBestFit->second;
167 size_t bestSpace = bestEnd - bestStart + 1;
168 _freeArrayStartSpace.erase(bestStart);
169 if (bestSpace == arraySize) {
171 _freeArrayEndSpace.erase(bestEnd);
174 size_t newFreeStart = bestStart + arraySize;
175 _freeArrayStartSpace[newFreeStart] = bestEnd;
176 _freeArrayEndSpace.at(bestEnd) = newFreeStart;
184 std::map<size_t, size_t>::iterator itEnd;
185 itEnd = _freeArrayEndSpace.find(_idArrayCount - 1 - 1);
186 if (itEnd != _freeArrayEndSpace.end()) {
188 size_t lastSpotStart = itEnd->second;
189 size_t lastSpotEnd = itEnd->first;
190 size_t lastSpotSize = lastSpotEnd - lastSpotStart + 1;
191 std::set<size_t>::const_iterator itBlack = blackList.lower_bound(lastSpotStart);
192 if (itBlack == blackList.end()) {
194 _freeArrayEndSpace.erase(itEnd);
195 _freeArrayStartSpace.erase(lastSpotStart);
197 _idArrayCount += arraySize - lastSpotSize;
198 bestStart = lastSpotStart;
202 if (bestStart == (std::numeric_limits<size_t>::max)()) {
204 size_t id = _idArrayCount;
205 _idArrayCount += arraySize;
210 for (
size_t i = 0; i < arraySize; i++) {
211 _tmpArrayValues[bestStart + i] = &args[i];
214 CPPADCG_ASSERT_UNKNOWN(_freeArrayStartSpace.size() == _freeArrayEndSpace.size());