Set configuration manager (#11534)

* Add the setter for the ConfigurationManager.

Also remove the implementation getter.

* Remove uses of ConfigurationMgrImpl.

Promote the reboot count, boot reason, and operational hours methods
to the ConfigurationManager interface.

* Add a static instance getter to the ConfigurationManagerImpl.

* Set the default ConfigurationManager instance in the platform manager.

* Update the tests to set a ConfigurationManager instance.

* Allow subclasses of the platform ConfigurationManagerImpls.

* Re-fix Ameba's ConfigurationManagerImpl.

* Restyled by clang-format

* Improvements from pull request comments.

* Add VerifyOrDie to the ConfigurationMgr getter.
* Pass a pointer rather than a reference to ConfigurationMgr.
* Explicitly default the instance pointer to nullptr.
* Move the singleton implementation out of each platform into a shared file.

* Update Ameba platform to remove the new uses of ConfigurationMgrImpl.

Co-authored-by: Restyled.io <commits@restyled.io>
diff --git a/src/platform/SingletonConfigurationManager.cpp b/src/platform/SingletonConfigurationManager.cpp
new file mode 100644
index 0000000..0658ebf
--- /dev/null
+++ b/src/platform/SingletonConfigurationManager.cpp
@@ -0,0 +1,53 @@
+/*
+ *
+ *    Copyright (c) 2021 Project CHIP Authors
+ *
+ *    Licensed under the Apache License, Version 2.0 (the "License");
+ *    you may not use this file except in compliance with the License.
+ *    You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ */
+
+/**
+ *    @file
+ *          Implements a getter and setter for a singleton ConfigurationManager object.
+ */
+
+#include <lib/support/CodeUtils.h>
+
+namespace chip {
+namespace DeviceLayer {
+
+class ConfigurationManager;
+
+namespace {
+
+/** Singleton pointer to the ConfigurationManager implementation.
+ */
+ConfigurationManager * gInstance = nullptr;
+
+} // namespace
+
+ConfigurationManager & ConfigurationMgr()
+{
+    VerifyOrDie(gInstance != nullptr);
+    return *gInstance;
+}
+
+void SetConfigurationMgr(ConfigurationManager * configurationManager)
+{
+    if (configurationManager != nullptr)
+    {
+        gInstance = configurationManager;
+    }
+}
+
+} // namespace DeviceLayer
+} // namespace chip