1f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz/* 2f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz * Copyright (C) 2017 The Android Open Source Project 3f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz * 4f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz * Licensed under the Apache License, Version 2.0 (the "License"); 5f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz * you may not use this file except in compliance with the License. 6f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz * You may obtain a copy of the License at 7f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz * 8f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz * http://www.apache.org/licenses/LICENSE-2.0 9f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz * 10f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz * Unless required by applicable law or agreed to in writing, software 11f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz * distributed under the License is distributed on an "AS IS" BASIS, 12f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz * See the License for the specific language governing permissions and 14f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz * limitations under the License. 15f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz */ 16f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz 17f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz#ifndef NETUTILS_MATH_H 18f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz#define NETUTILS_MATH_H 19f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz 20f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz#include <algorithm> 21f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz#include <cstdint> 22f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz 23f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelznamespace android { 24f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelznamespace netdutils { 25f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz 26f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelztemplate <class T> 27f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelzinline constexpr const T mask(const int shift) { 28f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz return (1 << shift) - 1; 29f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz} 30f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz 31f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz// Align x up to the nearest integer multiple of 2^shift 32f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelztemplate <class T> 33f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelzinline constexpr const T align(const T& x, const int shift) { 34f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz return (x + mask<T>(shift)) & ~mask<T>(shift); 35f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz} 36f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz 37f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz} // namespace netdutils 38f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz} // namespace android 39f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz 40f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz#endif /* NETUTILS_MATH_H */ 41