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