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