13daeb919SShawn McCarney /**
23daeb919SShawn McCarney  * Copyright © 2019 IBM Corporation
33daeb919SShawn McCarney  *
43daeb919SShawn McCarney  * Licensed under the Apache License, Version 2.0 (the "License");
53daeb919SShawn McCarney  * you may not use this file except in compliance with the License.
63daeb919SShawn McCarney  * You may obtain a copy of the License at
73daeb919SShawn McCarney  *
83daeb919SShawn McCarney  *     http://www.apache.org/licenses/LICENSE-2.0
93daeb919SShawn McCarney  *
103daeb919SShawn McCarney  * Unless required by applicable law or agreed to in writing, software
113daeb919SShawn McCarney  * distributed under the License is distributed on an "AS IS" BASIS,
123daeb919SShawn McCarney  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133daeb919SShawn McCarney  * See the License for the specific language governing permissions and
143daeb919SShawn McCarney  * limitations under the License.
153daeb919SShawn McCarney  */
163daeb919SShawn McCarney #pragma once
173daeb919SShawn McCarney 
183daeb919SShawn McCarney #include <map>
193daeb919SShawn McCarney #include <stdexcept>
203daeb919SShawn McCarney #include <string>
213daeb919SShawn McCarney 
22ea7385b8SShawn McCarney namespace phosphor::power::regulators
233daeb919SShawn McCarney {
243daeb919SShawn McCarney 
25*494ef03aSShawn McCarney // Forward declarations to avoid circular dependencies
26*494ef03aSShawn McCarney class Device;
27*494ef03aSShawn McCarney class Rail;
28*494ef03aSShawn McCarney class Rule;
29*494ef03aSShawn McCarney 
303daeb919SShawn McCarney /**
313daeb919SShawn McCarney  * @class IDMap
323daeb919SShawn McCarney  *
333daeb919SShawn McCarney  * This class provides a mapping from string IDs to the associated Device, Rail,
343daeb919SShawn McCarney  * and Rule objects.
353daeb919SShawn McCarney  */
363daeb919SShawn McCarney class IDMap
373daeb919SShawn McCarney {
383daeb919SShawn McCarney   public:
393daeb919SShawn McCarney     // Specify which compiler-generated methods we want
403daeb919SShawn McCarney     IDMap() = default;
413daeb919SShawn McCarney     IDMap(const IDMap&) = delete;
423daeb919SShawn McCarney     IDMap(IDMap&&) = delete;
433daeb919SShawn McCarney     IDMap& operator=(const IDMap&) = delete;
443daeb919SShawn McCarney     IDMap& operator=(IDMap&&) = delete;
453daeb919SShawn McCarney     ~IDMap() = default;
463daeb919SShawn McCarney 
473daeb919SShawn McCarney     /**
483daeb919SShawn McCarney      * Adds the specified device to this IDMap.
493daeb919SShawn McCarney      *
503daeb919SShawn McCarney      * @param device device to add
513daeb919SShawn McCarney      */
52*494ef03aSShawn McCarney     void addDevice(Device& device);
533daeb919SShawn McCarney 
543daeb919SShawn McCarney     /**
553daeb919SShawn McCarney      * Adds the specified rail to this IDMap.
563daeb919SShawn McCarney      *
573daeb919SShawn McCarney      * @param rail rail to add
583daeb919SShawn McCarney      */
59*494ef03aSShawn McCarney     void addRail(Rail& rail);
603daeb919SShawn McCarney 
613daeb919SShawn McCarney     /**
623daeb919SShawn McCarney      * Adds the specified rule to this IDMap.
633daeb919SShawn McCarney      *
643daeb919SShawn McCarney      * @param rule rule to add
653daeb919SShawn McCarney      */
66*494ef03aSShawn McCarney     void addRule(Rule& rule);
673daeb919SShawn McCarney 
683daeb919SShawn McCarney     /**
693daeb919SShawn McCarney      * Returns the device with the specified ID.
703daeb919SShawn McCarney      *
713daeb919SShawn McCarney      * Throws invalid_argument if no device is found with specified ID.
723daeb919SShawn McCarney      *
733daeb919SShawn McCarney      * @param id device ID
743daeb919SShawn McCarney      * @return device with specified ID
753daeb919SShawn McCarney      */
763daeb919SShawn McCarney     Device& getDevice(const std::string& id) const
773daeb919SShawn McCarney     {
783daeb919SShawn McCarney         auto it = deviceMap.find(id);
793daeb919SShawn McCarney         if (it == deviceMap.end())
803daeb919SShawn McCarney         {
813daeb919SShawn McCarney             throw std::invalid_argument{"Unable to find device with ID \"" +
823daeb919SShawn McCarney                                         id + '"'};
833daeb919SShawn McCarney         }
843daeb919SShawn McCarney         return *(it->second);
853daeb919SShawn McCarney     }
863daeb919SShawn McCarney 
873daeb919SShawn McCarney     /**
883daeb919SShawn McCarney      * Returns the rail with the specified ID.
893daeb919SShawn McCarney      *
903daeb919SShawn McCarney      * Throws invalid_argument if no rail is found with specified ID.
913daeb919SShawn McCarney      *
923daeb919SShawn McCarney      * @param id rail ID
933daeb919SShawn McCarney      * @return rail with specified ID
943daeb919SShawn McCarney      */
953daeb919SShawn McCarney     Rail& getRail(const std::string& id) const
963daeb919SShawn McCarney     {
973daeb919SShawn McCarney         auto it = railMap.find(id);
983daeb919SShawn McCarney         if (it == railMap.end())
993daeb919SShawn McCarney         {
1003daeb919SShawn McCarney             throw std::invalid_argument{"Unable to find rail with ID \"" + id +
1013daeb919SShawn McCarney                                         '"'};
1023daeb919SShawn McCarney         }
1033daeb919SShawn McCarney         return *(it->second);
1043daeb919SShawn McCarney     }
1053daeb919SShawn McCarney 
1063daeb919SShawn McCarney     /**
1073daeb919SShawn McCarney      * Returns the rule with the specified ID.
1083daeb919SShawn McCarney      *
1093daeb919SShawn McCarney      * Throws invalid_argument if no rule is found with specified ID.
1103daeb919SShawn McCarney      *
1113daeb919SShawn McCarney      * @param id rule ID
1123daeb919SShawn McCarney      * @return rule with specified ID
1133daeb919SShawn McCarney      */
1143daeb919SShawn McCarney     Rule& getRule(const std::string& id) const
1153daeb919SShawn McCarney     {
1163daeb919SShawn McCarney         auto it = ruleMap.find(id);
1173daeb919SShawn McCarney         if (it == ruleMap.end())
1183daeb919SShawn McCarney         {
1193daeb919SShawn McCarney             throw std::invalid_argument{"Unable to find rule with ID \"" + id +
1203daeb919SShawn McCarney                                         '"'};
1213daeb919SShawn McCarney         }
1223daeb919SShawn McCarney         return *(it->second);
1233daeb919SShawn McCarney     }
1243daeb919SShawn McCarney 
1253daeb919SShawn McCarney   private:
1263daeb919SShawn McCarney     /**
1273daeb919SShawn McCarney      * Map from device IDs to Device objects.  Does not own the objects.
1283daeb919SShawn McCarney      */
1293daeb919SShawn McCarney     std::map<std::string, Device*> deviceMap{};
1303daeb919SShawn McCarney 
1313daeb919SShawn McCarney     /**
1323daeb919SShawn McCarney      * Map from rail IDs to Rail objects.  Does not own the objects.
1333daeb919SShawn McCarney      */
1343daeb919SShawn McCarney     std::map<std::string, Rail*> railMap{};
1353daeb919SShawn McCarney 
1363daeb919SShawn McCarney     /**
1373daeb919SShawn McCarney      * Map from rule IDs to Rule objects.  Does not own the objects.
1383daeb919SShawn McCarney      */
1393daeb919SShawn McCarney     std::map<std::string, Rule*> ruleMap{};
1403daeb919SShawn McCarney };
1413daeb919SShawn McCarney 
142ea7385b8SShawn McCarney } // namespace phosphor::power::regulators
143