FBB::CmdFinder(3bobcat)
π FBB::CmdFinder(3bobcat) π
bestie, welcome to the command-function association zone β this whole manual page is about FBB::CmdFinder, and its original header vibe was Command-function associations. We're doing part 1, so hold onto your iced coffee π§, because there's more coming.
β¨ NAME β¨
FBB::CmdFinder β determine (member) function associated with a command. periodt.
π¦ SYNOPSIS π¦
#include <bobcat/cmdfinder>
Linking option: -lbobcat
πΈ DESCRIPTION πΈ
Okay so objects of class CmdFinder determine which (member) function to call given a command. The way that associations between commands and (member) functions are often defined in a switch, but bestie, a switch is not the preferred way to define these associations because the maintainability and clarity of switches suffer for even moderately large command sets. Moreover, the switch is hardly ever self-supporting, since usually some command-processing is required to determine command/case-value associations. it's giving messy.
The alternative (and preferred) approach, which is also taken by CmdFinder, is to define an array of pointers to (member) functions, and to define the associations between commands and member functions as a mapping of commands to array indices. Plain associations between (textual) commands and functions to be called can also easily be defined using a std::map or other hash-type data structure. However, the syntactical requirements for such a std::map structure are non-trivial, and besides: user-entered commands often require some preprocessing before a command can be used as an index in a std::map. lowkey why we're here.
The class CmdFinder is an attempt to offer a versatile implementation of associations between commands and (member) functions. In particular, the class offers the following features:
- Associations between textual commands and (member) functions are defined in a simple array of pairs: the first element defining a command, the second element containing the address of the function associated with the command. The function addresses may either be addresses of free or static member functions or they may be defined as member function addresses. slay.
- Commands may be used
as-is, or the first word in astd::stringmay be used as the command; - Commands may be specified case sensitively or case insensitively;
- Commands may have to be specified in full, or unique abbreviations of the commands may be accepted;
- Several types are defined by the class
CmdFinder, further simplifying the derivation of classes fromCmdFinder.
The class CmdFinder itself is defined as a template class. This template class should be used as a base class of a user-defined derived class defining the array of command-function associations. The class CmdFinder itself is a derived class of the class CmdFinderBase, defining some template-independent functionality that is used by CmdFinder. The enumeration and member functions sections below also contain the members that are available to classes derived from CmdFinder, but which are actually defined in the class CmdFinderBase. iykyk.
π NAMESPACE π
FBB
All constructors, members, operators and manipulators, mentioned in this man-page, are defined in the namespace FBB. β¨
π INHERITS FROM π
FBB::CmdFinderBase
π₯ ENUMERATION π₯
The enumeration Mode is defined in the class CmdFinderBase. It contains the following values, which may be combined by the bit_or operator to specify the CmdFinder object's required mode of operation:
USE_FIRSTβ This value can be specified when the first word (any white-space separated series of characters) of a provided textual command should be used as the command to find. Both the command that is used and any trailing information that may be present can be obtained from theCmdFinderobject. By default, the complete content of the provided command is used. first word only? okay bestie, we support it.UNIQUEβ This value can be specified when any unique abbreviation of a command may be accepted. Assuming that the commandshelpandversionare defined, then the following (non-exhaustive) series are all accepted as specifications of thehelpcommand ifUNIQUEis specified:h,he,el,p. By default the command must match a command-key as found in the array of command-function associations exactly. no cap,elis wild but true.INSENSITIVEβ When this value is specified, commands may be specified disregarding letter-casing. E.g., whenINSENSITIVEis specified, bothHelpandHELPare recognized ashelp. By default, letter casing is obeyed. So, by default a full, literal match between provided command and predefined command-keys is required. case queen π.
π¦ TEMPLATE TYPE PARAMETER π¦
The template class CmdFinder has one template type parameter, which is the prototype of the functions defined in the array of command-function associations. This type becomes available as the typename FunctionPtr (defined by the class CmdFinder in the class that is derived from CmdFinder).
π PROTECTED DEFINED TYPES π
The following (protected) types are defined by the template class CmdFinder:
FunctionPtrβ This type represents a pointer to the functions whose addresses are stored in the array of command-function associations.Entryβ This type represents the typestd::pair<char const *, FunctionPtr>. Its first field is the name of a command, its second field is the function address associated with the command name. pair energy, but make it commandful.
π CONSTRUCTORS π
CmdFinder<FunctionPtr>(Entry const *begin, Entry const *end, size_t mode = 0):β This constructor is defined in the protected section of theCmdFinderclass. Its parametersbeginandenddefine the half-open range ofEntryobjects, defining the associations between commands and functions. The parameterbeginshould be initialized to the first element of an array ofEntryobjects, the parameterendmust point just beyond the last element of the array. The parametermodemay be specified using any combination of values of theModeenumeration, using thebit_oroperator to combine multiple values. When a non-supported value is specified formode, anFBB::Exceptionexception is thrown. throwing hands, but make it exceptions.- Note: There is no default constructor.
Copy and move constructors (and assignment operators) are available. we love a copy-move moment.
β PUBLIC MEMBER FUNCTION β
setMode(size_t mode):β This member function (defined in the classCmdFinderBase) may be called to redefine the mode of theCmdFinderobject. Themodeparameter should be initialized subject to the same restrictions as mentioned with theCmdFinder's constructor. mode switch, but make it legal.
π«Ά PROTECTED MEMBER FUNCTIONS π«Ά
std::string const &beyond() const:β This member function returns the text that may have been entered beyond the command (ifModevalueUSE_FIRSTwas specified). It is empty if no text beyond the command was encountered. It is initially empty, and will be redefined at each call offindCmd()(see below). leftover text? we got you.std::string const &cmd() const:β This member returns the original (untransformed) command as encountered by theCmdFinderobject. It is initially empty, and will be redefined at each call offindCmd()(see below). object.size_t count() const:β This member function returns the number of commands matching the command that is passed to the functionfindCmd()(see below). Its return value is0whenfindCmd()hasn't been called yet and is updated at each new call offindCmd(). count go brrr.FunctionPtr findCmd(std::string const &cmd):β Regarding theCmdFinderobject's mode setting, this function returns the address of the function to call given the provided command. By default, if no match was found, the address of the function stored in the last element of the array of command-function associations is returned (i.e, elementend[-1]). the fallback bestie.void swap(CmdFinderBase &other):β The current andotherobject are swapped. swaperoo.
π PROTECTED DATA MEMBERS π
The class CmdFinder has access to some protected data members of the class CmdFinderBase, which should not be used or modified by classes derived from CmdFinder. hands off, bestie.
β¨ EXAMPLE β¨
okay bestie, hereβs the whole demo β every line exactly as it is, no cap:
#include <iostream>
#include <string>
#include <bobcat/cmdfinder>
using namespace std;
using namespace FBB;
// Define a class `Commandβ in which the array s_action defines the
// command-function associations. Command is derived from CmdFinder,
// specifying the prototype of the member functions to be called
class Command: public CmdFinder<bool (Command::*)() const>
{
static Entry s_action[];
bool add() const // some member functions
{
cout << "add called: command was `" << cmd() << "β\n";
if (beyond().length())
cout << "Beyond " << cmd() << " `" << beyond() << "β\n";
return true;
}
bool error() const
{
cout << "unrecognized command: `" << cmd() << "β called\n" <<
count() << " matching alternatives found\n";
return true;
}
bool quit() const
{
cout << "quit called: quitting this series\n";
return false;
}
public:
Command(); // Declare the default constructor
bool run(std::string const &cmd) // run a command
{
return (this->*findCmd(cmd))(); // execute the command matching
// βcmdβ
}
};
// Define command-function associations. Note that the last is given an empty
// command-text. This is not required, a command text could have been
// specified for the last command as well.
Command::Entry Command::s_action[] =
{
Entry("add", &Command::add),
Entry("quit", &Command::quit),
Entry("", &Command::error),
};
// Define the default constructor
Command::Command() // Define the default constructor
: // Note the use of `FunctionPtrβ
CmdFinder<FunctionPtr>(s_action, s_action +
sizeof(s_action) / sizeof(Entry))
{}
void run(Command &cmd, char const *descr, size_t mode = 0)
{
if (mode)
cmd.setMode(mode);
cout << "Enter 5 x a command using " << descr << ".\n";
for (size_t idx = 0; idx++ < 5; )
{
cout << "Enter command " << idx << ": ";
string text;
getline(cin, text);
if (!cmd.run(text)) // run a command
break;
}
}
int main()
{
Command cmd; // define a command
// enter 5 commands using the default mode
run (cmd, "the default mode");
run (cmd, "abbreviated commands", Command::UNIQUE);
run (cmd, "abbreviated case-insensitive commands",
Command::UNIQUE | Command::INSENSITIVE);
run (cmd, "abbreviated command lines",
Command::USE_FIRST | Command::UNIQUE);
run (cmd, "abbreviated case-insensitive command lines",
Command::USE_FIRST | Command::UNIQUE |
Command::INSENSITIVE);
}
π FILES π
bobcat/cmdfinderβ defines the class interfacebobcat/cmdfinderbaseβ defines the base class ofCmdFinder.
π SEE ALSO π
π BUGS π
None Reported.
periodt π
π BOBCAT PROJECT FILES π
https://fbb-git.gitlab.io/bobcat/: gitlab project page;- Debian Bobcat project files:
libbobcat6: debian package containing the shared library, changelog and copyright note;libbobcat-dev: debian package containing the static library, headers, manual pages, and developer info;
π± BOBCAT π±
Bobcat is an acronym of `Brokkenβs Own Base Classes And Templatesβ.
βοΈ COPYRIGHT βοΈ
This is free software, distributed under the terms of the GNU General Public License (GPL).
βοΈ AUTHOR βοΈ
Frank B. Brokken (f.b.brokken@rug.nl).
This page is from libbobcat-dev_6.15.01, dated 2005-2026, and itβs the man page for FBB::CmdFinder(3bobcat). bye bestie π
π¦ where this page comes from
- ubuntu stonking: libbobcat-dev 6.15.01-1 Β· GPL-3.0-or-later WITH OpenSSL exception
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms