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