18be5eabe6a4fc60c56a3b32794bb6677e26f6eabBrian Duddie/*
28be5eabe6a4fc60c56a3b32794bb6677e26f6eabBrian Duddie * Copyright (C) 2017 The Android Open Source Project
38be5eabe6a4fc60c56a3b32794bb6677e26f6eabBrian Duddie *
48be5eabe6a4fc60c56a3b32794bb6677e26f6eabBrian Duddie * Licensed under the Apache License, Version 2.0 (the "License");
58be5eabe6a4fc60c56a3b32794bb6677e26f6eabBrian Duddie * you may not use this file except in compliance with the License.
68be5eabe6a4fc60c56a3b32794bb6677e26f6eabBrian Duddie * You may obtain a copy of the License at
78be5eabe6a4fc60c56a3b32794bb6677e26f6eabBrian Duddie *
88be5eabe6a4fc60c56a3b32794bb6677e26f6eabBrian Duddie *      http://www.apache.org/licenses/LICENSE-2.0
98be5eabe6a4fc60c56a3b32794bb6677e26f6eabBrian Duddie *
108be5eabe6a4fc60c56a3b32794bb6677e26f6eabBrian Duddie * Unless required by applicable law or agreed to in writing, software
118be5eabe6a4fc60c56a3b32794bb6677e26f6eabBrian Duddie * distributed under the License is distributed on an "AS IS" BASIS,
128be5eabe6a4fc60c56a3b32794bb6677e26f6eabBrian Duddie * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138be5eabe6a4fc60c56a3b32794bb6677e26f6eabBrian Duddie * See the License for the specific language governing permissions and
148be5eabe6a4fc60c56a3b32794bb6677e26f6eabBrian Duddie * limitations under the License.
158be5eabe6a4fc60c56a3b32794bb6677e26f6eabBrian Duddie */
168be5eabe6a4fc60c56a3b32794bb6677e26f6eabBrian Duddie
178be5eabe6a4fc60c56a3b32794bb6677e26f6eabBrian Duddie#ifndef CHRE_UTIL_MEMORY_H_
188be5eabe6a4fc60c56a3b32794bb6677e26f6eabBrian Duddie#define CHRE_UTIL_MEMORY_H_
198be5eabe6a4fc60c56a3b32794bb6677e26f6eabBrian Duddie
208be5eabe6a4fc60c56a3b32794bb6677e26f6eabBrian Duddienamespace chre {
218be5eabe6a4fc60c56a3b32794bb6677e26f6eabBrian Duddie
228be5eabe6a4fc60c56a3b32794bb6677e26f6eabBrian Duddie/**
238be5eabe6a4fc60c56a3b32794bb6677e26f6eabBrian Duddie * Destroys count objects starting at first. This function is similar to
248be5eabe6a4fc60c56a3b32794bb6677e26f6eabBrian Duddie * std::destroy_n.
258be5eabe6a4fc60c56a3b32794bb6677e26f6eabBrian Duddie *
268be5eabe6a4fc60c56a3b32794bb6677e26f6eabBrian Duddie * @param first Starting address of count objects to destroy
278be5eabe6a4fc60c56a3b32794bb6677e26f6eabBrian Duddie * @param count The number of objects to destroy
288be5eabe6a4fc60c56a3b32794bb6677e26f6eabBrian Duddie */
298be5eabe6a4fc60c56a3b32794bb6677e26f6eabBrian Duddietemplate<typename ElementType>
308be5eabe6a4fc60c56a3b32794bb6677e26f6eabBrian Duddievoid destroy(ElementType *first, size_t count);
318be5eabe6a4fc60c56a3b32794bb6677e26f6eabBrian Duddie
328be5eabe6a4fc60c56a3b32794bb6677e26f6eabBrian Duddie/**
338be5eabe6a4fc60c56a3b32794bb6677e26f6eabBrian Duddie * Performs move assignment (dest = std::move(source)) if supported by
348be5eabe6a4fc60c56a3b32794bb6677e26f6eabBrian Duddie * ElementType, otherwise copy assignment (dest = source).
358be5eabe6a4fc60c56a3b32794bb6677e26f6eabBrian Duddie */
368be5eabe6a4fc60c56a3b32794bb6677e26f6eabBrian Duddietemplate<typename ElementType>
378be5eabe6a4fc60c56a3b32794bb6677e26f6eabBrian Duddievoid moveOrCopyAssign(ElementType& dest, ElementType& source);
388be5eabe6a4fc60c56a3b32794bb6677e26f6eabBrian Duddie
398be5eabe6a4fc60c56a3b32794bb6677e26f6eabBrian Duddie/**
408be5eabe6a4fc60c56a3b32794bb6677e26f6eabBrian Duddie * Initializes a new block of memory by transferring objects from another block,
418be5eabe6a4fc60c56a3b32794bb6677e26f6eabBrian Duddie * using memcpy if valid for the underlying type, or the move constructor if
428be5eabe6a4fc60c56a3b32794bb6677e26f6eabBrian Duddie * available, or the copy constructor. This function is similar to
438be5eabe6a4fc60c56a3b32794bb6677e26f6eabBrian Duddie * std::uninitialized_move_n.
448be5eabe6a4fc60c56a3b32794bb6677e26f6eabBrian Duddie *
458be5eabe6a4fc60c56a3b32794bb6677e26f6eabBrian Duddie * @param source The beginning of the data to transfer
468be5eabe6a4fc60c56a3b32794bb6677e26f6eabBrian Duddie * @param count The number of elements to transfer
478be5eabe6a4fc60c56a3b32794bb6677e26f6eabBrian Duddie * @param dest An uninitialized buffer to be populated with count elements
488be5eabe6a4fc60c56a3b32794bb6677e26f6eabBrian Duddie */
498be5eabe6a4fc60c56a3b32794bb6677e26f6eabBrian Duddietemplate<typename ElementType>
508be5eabe6a4fc60c56a3b32794bb6677e26f6eabBrian Duddievoid uninitializedMoveOrCopy(ElementType *source, size_t count,
518be5eabe6a4fc60c56a3b32794bb6677e26f6eabBrian Duddie                             ElementType *dest);
528be5eabe6a4fc60c56a3b32794bb6677e26f6eabBrian Duddie
5397156830527953070044eed8b0eb42ba689c53c4Andrew Rossignol/**
5497156830527953070044eed8b0eb42ba689c53c4Andrew Rossignol * Allocates memory for an object of size T and constructs the object in the
5597156830527953070044eed8b0eb42ba689c53c4Andrew Rossignol * newly allocated object by forwarding the provided parameters.
5697156830527953070044eed8b0eb42ba689c53c4Andrew Rossignol */
5797156830527953070044eed8b0eb42ba689c53c4Andrew Rossignoltemplate<typename T, typename... Args>
5897156830527953070044eed8b0eb42ba689c53c4Andrew RossignolT *memoryAlloc(Args&&... args);
5997156830527953070044eed8b0eb42ba689c53c4Andrew Rossignol
608be5eabe6a4fc60c56a3b32794bb6677e26f6eabBrian Duddie}  // namespace chre
618be5eabe6a4fc60c56a3b32794bb6677e26f6eabBrian Duddie
628be5eabe6a4fc60c56a3b32794bb6677e26f6eabBrian Duddie#include "chre/util/memory_impl.h"
638be5eabe6a4fc60c56a3b32794bb6677e26f6eabBrian Duddie
648be5eabe6a4fc60c56a3b32794bb6677e26f6eabBrian Duddie#endif  // CHRE_UTIL_MEMORY_H
65