/**************************************************************************/1/* variant_pools.h */2/**************************************************************************/3/* This file is part of: */4/* GODOT ENGINE */5/* https://godotengine.org */6/**************************************************************************/7/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */8/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */9/* */10/* Permission is hereby granted, free of charge, to any person obtaining */11/* a copy of this software and associated documentation files (the */12/* "Software"), to deal in the Software without restriction, including */13/* without limitation the rights to use, copy, modify, merge, publish, */14/* distribute, sublicense, and/or sell copies of the Software, and to */15/* permit persons to whom the Software is furnished to do so, subject to */16/* the following conditions: */17/* */18/* The above copyright notice and this permission notice shall be */19/* included in all copies or substantial portions of the Software. */20/* */21/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */22/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */23/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */24/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */25/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */26/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */27/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */28/**************************************************************************/2930#pragma once3132#include "core/math/math_defs.h"33#include "core/os/memory.h"3435namespace VariantPools {36inline constexpr size_t BUCKET_SMALL = 2 * 3 * sizeof(real_t);37inline constexpr size_t BUCKET_MEDIUM = 4 * 3 * sizeof(real_t);38inline constexpr size_t BUCKET_LARGE = 4 * 4 * sizeof(real_t);3940void *alloc_small();41void *alloc_medium();42void *alloc_large();4344template <typename T>45_FORCE_INLINE_ T *alloc() {46if constexpr (sizeof(T) <= BUCKET_SMALL && alignof(real_t) % alignof(T) == 0) {47return static_cast<T *>(alloc_small());48} else if constexpr (sizeof(T) <= BUCKET_MEDIUM && alignof(real_t) % alignof(T) == 0) {49return static_cast<T *>(alloc_medium());50} else if constexpr (sizeof(T) <= BUCKET_LARGE && alignof(real_t) % alignof(T) == 0) {51return static_cast<T *>(alloc_large());52} else {53return memnew(T);54}55}5657void free_small(void *p_ptr);58void free_medium(void *p_ptr);59void free_large(void *p_ptr);6061template <typename T>62_FORCE_INLINE_ void free(T *p_ptr) {63if constexpr (sizeof(T) <= BUCKET_SMALL && alignof(real_t) % alignof(T) == 0) {64free_small(p_ptr);65} else if constexpr (sizeof(T) <= BUCKET_MEDIUM && alignof(real_t) % alignof(T) == 0) {66free_medium(p_ptr);67} else if constexpr (sizeof(T) <= BUCKET_LARGE && alignof(real_t) % alignof(T) == 0) {68free_large(p_ptr);69} else {70memdelete(p_ptr);71}72}73}; //namespace VariantPools747576