]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/kyua/utils/cmdline/commands_map.ipp
Import the kyua test framework.
[FreeBSD/FreeBSD.git] / contrib / kyua / utils / cmdline / commands_map.ipp
1 // Copyright 2011 The Kyua Authors.
2 // All rights reserved.
3 //
4 // Redistribution and use in source and binary forms, with or without
5 // modification, are permitted provided that the following conditions are
6 // met:
7 //
8 // * Redistributions of source code must retain the above copyright
9 //   notice, this list of conditions and the following disclaimer.
10 // * Redistributions in binary form must reproduce the above copyright
11 //   notice, this list of conditions and the following disclaimer in the
12 //   documentation and/or other materials provided with the distribution.
13 // * Neither the name of Google Inc. nor the names of its contributors
14 //   may be used to endorse or promote products derived from this software
15 //   without specific prior written permission.
16 //
17 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
29 #include "utils/cmdline/commands_map.hpp"
30 #include "utils/sanity.hpp"
31
32
33 namespace utils {
34
35
36 /// Constructs an empty set of commands.
37 template< typename BaseCommand >
38 cmdline::commands_map< BaseCommand >::commands_map(void)
39 {
40 }
41
42
43 /// Destroys a set of commands.
44 ///
45 /// This releases the dynamically-instantiated objects.
46 template< typename BaseCommand >
47 cmdline::commands_map< BaseCommand >::~commands_map(void)
48 {
49     for (typename impl_map::iterator iter = _commands.begin();
50          iter != _commands.end(); iter++)
51         delete (*iter).second;
52 }
53
54
55 /// Inserts a new command into the map.
56 ///
57 /// \param command The command to insert.  This must have been dynamically
58 ///     allocated with new.  The call grabs ownership of the command, or the
59 ///     command is freed if the call fails.
60 /// \param category The category this command belongs to.  Defaults to the empty
61 ///     string, which indicates that the command has not be categorized.
62 template< typename BaseCommand >
63 void
64 cmdline::commands_map< BaseCommand >::insert(command_ptr command,
65                                              const std::string& category)
66 {
67     INV(_commands.find(command->name()) == _commands.end());
68     BaseCommand* ptr = command.release();
69     INV(ptr != NULL);
70     _commands[ptr->name()] = ptr;
71     _categories[category].insert(ptr->name());
72 }
73
74
75 /// Inserts a new command into the map.
76 ///
77 /// This grabs ownership of the pointer, so it is ONLY safe to use with the
78 /// following idiom: insert(new foo()).
79 ///
80 /// \param command The command to insert.  This must have been dynamically
81 ///     allocated with new.  The call grabs ownership of the command, or the
82 ///     command is freed if the call fails.
83 /// \param category The category this command belongs to.  Defaults to the empty
84 ///     string, which indicates that the command has not be categorized.
85 template< typename BaseCommand >
86 void
87 cmdline::commands_map< BaseCommand >::insert(BaseCommand* command,
88                                              const std::string& category)
89 {
90     insert(command_ptr(command), category);
91 }
92
93
94 /// Checks whether the list of commands is empty.
95 ///
96 /// \return True if there are no commands in this map.
97 template< typename BaseCommand >
98 bool
99 cmdline::commands_map< BaseCommand >::empty(void) const
100 {
101     return _commands.empty();
102 }
103
104
105 /// Returns a constant iterator to the beginning of the categories mapping.
106 ///
107 /// \return A map (string -> BaseCommand*) iterator.
108 template< typename BaseCommand >
109 typename cmdline::commands_map< BaseCommand >::const_iterator
110 cmdline::commands_map< BaseCommand >::begin(void) const
111 {
112     return _categories.begin();
113 }
114
115
116 /// Returns a constant iterator to the end of the categories mapping.
117 ///
118 /// \return A map (string -> BaseCommand*) iterator.
119 template< typename BaseCommand >
120 typename cmdline::commands_map< BaseCommand >::const_iterator
121 cmdline::commands_map< BaseCommand >::end(void) const
122 {
123     return _categories.end();
124 }
125
126
127 /// Finds a command by name; mutable version.
128 ///
129 /// \param name The name of the command to locate.
130 ///
131 /// \return The command itself or NULL if it does not exist.
132 template< typename BaseCommand >
133 BaseCommand*
134 cmdline::commands_map< BaseCommand >::find(const std::string& name)
135 {
136     typename impl_map::iterator iter = _commands.find(name);
137     if (iter == _commands.end())
138         return NULL;
139     else
140         return (*iter).second;
141 }
142
143
144 /// Finds a command by name; constant version.
145 ///
146 /// \param name The name of the command to locate.
147 ///
148 /// \return The command itself or NULL if it does not exist.
149 template< typename BaseCommand >
150 const BaseCommand*
151 cmdline::commands_map< BaseCommand >::find(const std::string& name) const
152 {
153     typename impl_map::const_iterator iter = _commands.find(name);
154     if (iter == _commands.end())
155         return NULL;
156     else
157         return (*iter).second;
158 }
159
160
161 }  // namespace utils