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