From f0901aec9160175eab49586f02539536a5d807fb Mon Sep 17 00:00:00 2001 From: Blake Matheny Date: Wed, 29 Apr 2015 08:35:30 -0700 Subject: [PATCH] get_or_throw and get_optional Summary: Adds get_or_throw map helper (get a value, or throw with the specified exception type) and get_optional (get an Optional). This is a folly backport of some util helpers in experimental. Test Plan: Unit tests Reviewed By: wez@fb.com Subscribers: folly-diffs@, yfeldblum, chalfant FB internal diff: D2029802 Tasks: 4332480 Signature: t1:2029802:1430280249:3efbb2fb9394e31b3fbe6d5bd209d12ebb7ed587 --- folly/MapUtil.h | 33 +++++++++++++++++++++++++++++++++ folly/test/MapUtilTest.cpp | 22 ++++++++++++++++++++++ 2 files changed, 55 insertions(+) diff --git a/folly/MapUtil.h b/folly/MapUtil.h index 25863370..b00bccff 100644 --- a/folly/MapUtil.h +++ b/folly/MapUtil.h @@ -17,6 +17,9 @@ #ifndef FOLLY_MAPUTIL_H_ #define FOLLY_MAPUTIL_H_ +#include +#include + namespace folly { /** @@ -32,6 +35,36 @@ typename Map::mapped_type get_default( return (pos != map.end() ? pos->second : dflt); } +/** + * Given a map and a key, return the value corresponding to the key in the map, + * or throw an exception of the specified type. + */ +template +typename Map::mapped_type get_or_throw( + const Map& map, const typename Map::key_type& key, + const std::string& exceptionStrPrefix = std::string()) { + auto pos = map.find(key); + if (pos != map.end()) { + return pos->second; + } + throw E(folly::to(exceptionStrPrefix, key)); +} + +/** + * Given a map and a key, return a Optional if the key exists and None if the + * key does not exist in the map. + */ +template +folly::Optional get_optional( + const Map& map, const typename Map::key_type& key) { + auto pos = map.find(key); + if (pos != map.end()) { + return folly::Optional(pos->second); + } else { + return folly::none; + } +} + /** * Given a map and a key, return a reference to the value corresponding to the * key in the map, or the given default reference if the key doesn't exist in diff --git a/folly/test/MapUtilTest.cpp b/folly/test/MapUtilTest.cpp index 4bb3974c..f6d6902f 100644 --- a/folly/test/MapUtilTest.cpp +++ b/folly/test/MapUtilTest.cpp @@ -29,6 +29,28 @@ TEST(MapUtil, get_default) { EXPECT_EQ(0, get_default(m, 3)); } +TEST(MapUtil, get_or_throw) { + std::map m; + m[1] = 2; + EXPECT_EQ(2, get_or_throw(m, 1)); + EXPECT_THROW(get_or_throw(m, 2), std::out_of_range); +} + +TEST(MapUtil, get_or_throw_specified) { + std::map m; + m[1] = 2; + EXPECT_EQ(2, get_or_throw(m, 1)); + EXPECT_THROW(get_or_throw(m, 2), std::runtime_error); +} + +TEST(MapUtil, get_optional) { + std::map m; + m[1] = 2; + EXPECT_TRUE(get_optional(m, 1)); + EXPECT_EQ(2, get_optional(m, 1).value()); + EXPECT_FALSE(get_optional(m, 2)); +} + TEST(MapUtil, get_ref_default) { std::map m; m[1] = 2; -- 2.34.1