/* * ExtLib * Copyright 2024 Dominick Allen * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "memory.hpp" #include namespace fud { FudStatus copyMem(void* destination, size_t destination_size, const void* source, size_t count) { if (anyAreNull(destination, source)) { return FudStatus::NullPointer; } if (destination_size < count) { return FudStatus::InvalidInput; } auto* destPtr = static_cast(destination); const auto* sourcePtr = static_cast(source); for (decltype(destination_size) idx = 0; idx < count; ++idx) { destPtr[idx] = sourcePtr[idx]; } return FudStatus::Success; } FudStatus compareMem(const void* lhs, size_t destination_size, const void* rhs, size_t count, int* difference) { if (anyAreNull(lhs, rhs, difference)) { return FudStatus::NullPointer; } if (destination_size < count) { return FudStatus::InvalidInput; } int localDifference = 0; // NOLINTBEGIN(readability-magic-numbers) for (decltype(destination_size) idx = 0; idx < count; idx++) { localDifference = static_cast(lhs)[idx] - static_cast(rhs)[idx]; if (localDifference != 0) { *difference = localDifference; return FudStatus::Success; } } *difference = localDifference; return FudStatus::Success; } Result compareMem(const void* lhs, size_t destination_size, const void* rhs, size_t count) { int difference = 0; auto status = compareMem(lhs, destination_size, rhs, count, &difference); if (status != FudStatus::Success) { return Result::error(status); } return Result::okay(difference); } FudStatus setMemory(void* data, size_t dataSize, uint8_t pattern, size_t count) { if (data == nullptr) { return FudStatus::NullPointer; } if (count > dataSize) { return FudStatus::InvalidInput; } for (size_t idx = 0; idx < count; ++idx) { static_cast(data)[idx] = pattern; } return FudStatus::Success; } FudStatus setMemory( void* data, size_t collectionCount, size_t eltOffset, size_t eltSize, uint8_t pattern, size_t eltCount) { if (eltOffset >= collectionCount) { return FudStatus::InvalidInput; } if (eltOffset + eltCount > collectionCount) { return FudStatus::InvalidInput; } auto dataSize = collectionCount * eltSize; auto byteOffset = eltOffset * eltSize; auto byteCount = eltCount * eltSize; auto remainingSize = dataSize - byteOffset; auto* offsetData = static_cast(data) + byteOffset; return setMemory(offsetData, remainingSize, pattern, byteCount); } } // namespace fud