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_MISC_H
18f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz#define NETUTILS_MISC_H
19f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz
20f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz#include <map>
21f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz
22f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelznamespace android {
23f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelznamespace netdutils {
24f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz
25f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz// Lookup key in map, returing a default value if key is not found
26f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelztemplate <typename U, typename V>
27f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelzinline const V& findWithDefault(const std::map<U, V>& map, const U& key, const V& dflt) {
28f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz    auto it = map.find(key);
29f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz    return (it == map.end()) ? dflt : it->second;
30f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz}
31f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz
32f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz// Movable, copiable, scoped lambda (or std::function) runner. Useful
33f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz// for running arbitrary cleanup or logging code when exiting a scope.
34f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz//
35f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz// Compare to defer in golang.
36f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelztemplate <typename FnT>
37f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelzclass Cleanup {
38f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz  public:
39f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz    Cleanup() = delete;
40f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz    Cleanup(FnT fn) : mFn(fn) {}
41f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz    ~Cleanup() { mFn(); }
42f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz
43f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz    void release() { mFn = {}; }
44f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz
45f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz  private:
46f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz    FnT mFn;
47f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz};
48f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz
49f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz// Helper to make a new Cleanup. Avoids complex or impossible syntax
50f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz// when wrapping lambdas.
51f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz//
52f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz// Usage:
53f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz// auto cleanup = makeCleanup([](){ your_code_here; });
54f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelztemplate <typename FnT>
55f3fa5cc9032d5f12b284e756993736b241a24b68Joel ScherpelzCleanup<FnT> makeCleanup(FnT fn) {
56f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz    return Cleanup<FnT>(fn);
57f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz}
58f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz
59f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz}  // namespace netdutils
60f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz}  // namespace android
61f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz
62f3fa5cc9032d5f12b284e756993736b241a24b68Joel Scherpelz#endif /* NETUTILS_MISC_H */
63