/* * Copyright (C) 2015 The Android Open Source Project * * 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. */ #pragma once #include #define array_copy(dest, src, count) \ do { \ STATIC_ASSERT(sizeof((dest)[0]) == sizeof((src)[0])); \ memcpy((dest), (src), sizeof((dest)[0]) * (count)); \ } while (false) #define array_shift(array, dest, src) \ do { \ assert(src <= countof((array))); \ assert(dest <= countof((array))); \ memmove((array) + (dest), (array) + (src), \ sizeof((array)[0]) * (countof((array)) - MAX((src), (dest)))); \ } while (false) #define array_insert(array, index, value) \ do { \ array_shift((array), (index) + 1, (index)); \ (array)[(index)] = (value); \ } while (false) #define array_insert_overflow(array, index, value, overflow_value) \ do { \ if (index == countof((array))) { \ *overflow_value = value; \ } else { \ *overflow_value = (array)[countof((array)) - 1]; \ array_insert((array), (index), (value)); \ } \ } while (false) #define array_clear_end(array, start) \ do { \ memset((array) + (start), 0, \ sizeof((array)[0]) * (countof((array)) - (start))); \ } while (false) #define array_shift_down(array, dest, src) \ do { \ assert(src > dest); \ assert(src <= countof((array))); \ array_shift((array), (dest), (src)); \ array_clear_end((array), countof((array)) - ((src) - (dest))); \ } while (false)