Introduce CachedParsedProperty, CachedBoolProperty.

Add helper classes for CachedProperty that cache the results of parsing
property values.

Test: libbase_test on x86_64 emulator
Change-Id: I48513acedc7f375d1c675c90033a5b5b975ec4d1
diff --git a/properties.cpp b/properties.cpp
index 7e851e6..a20db54 100644
--- a/properties.cpp
+++ b/properties.cpp
@@ -299,6 +299,27 @@
   return Get(nullptr);
 }
 
+CachedBoolProperty::CachedBoolProperty(std::string property_name)
+    : cached_parsed_property_(std::move(property_name),
+                              [](const char* value) -> std::optional<bool> {
+                                switch (ParseBool(value)) {
+                                  case ParseBoolResult::kError:
+                                    return std::nullopt;
+                                  case ParseBoolResult::kFalse:
+                                    return false;
+                                  case ParseBoolResult::kTrue:
+                                    return true;
+                                }
+                              }) {}
+
+std::optional<bool> CachedBoolProperty::GetOptional() {
+  return cached_parsed_property_.Get();
+}
+
+bool CachedBoolProperty::Get(bool default_value) {
+  return GetOptional().value_or(default_value);
+}
+
 #endif
 
 }  // namespace base