80 issue +=
"The given argument [";
82 issue +=
"] does not represent an option which must begin with the '--' prefix. ";
84 throw std::runtime_error(issue);
91 issue +=
"The given option [";
93 issue +=
"] is defined twice in the argument list. ";
95 throw std::runtime_error(issue);
118 if (isOption(*carriage, &option))
124 const std::pair<Items::iterator, bool> inserted =
125 items_.insert(std::make_pair(option,
OptionArgs()));
129 OptionArgs& optionArgs = inserted.first->second;
131 while (carriage && !isOption(*carriage, &option))
133 optionArgs.push_back(*carriage);
153 template <
class Iterator>
154 void get(Iterator target)
const
156 std::transform(items_.begin(), items_.end(), target, PairFirst<Option, OptionArgs>());
162 return args(option ? std::string(option) : std::string());
168 const auto foundItem = items_.find(option);
169 return (foundItem != items_.end() ? &foundItem->second :
nullptr);
173 template <
typename First,
typename Second>
176 typedef std::pair<First, Second> Pair;
178 inline First operator()(
const Pair& item)
const
184 typedef std::map<Option, OptionArgs> Items;
188 static bool isOption(
const char* arg, std::string* option =
nullptr)
192 const size_t argLength = strlen(arg);
196 if (argLength > prefix.size() && prefix ==
StrRef(arg, prefix.size()) && prefix[0] != arg[prefix.size()])
199 option->assign(arg + prefix.size(), argLength - prefix.size());
211 assert(
nullptr != option);
215 issue +=
"Value for the option [";
217 issue +=
"] is not recognized. Run application help for information on valid values for the option. ";
219 throw std::runtime_error(issue);
243template <
typename Value>
254 Value value = Value();
290template <
typename Value>
295 value = converter(str);
300 assert(
nullptr != option);
304 issue +=
"Number of arguments for the option [";
308 issue +=
"] does not meet the requirements. "
309 "It must be not less than ";
311 toStr(issue, minQty);
313 if (maxQty !=
static_cast<size_t>(-1))
315 issue +=
" and not greater than ";
317 toStr(issue, maxQty);
320 issue +=
". Meanwhile, the actual number is ";
322 toStr(issue, argQty);
326 throw std::runtime_error(issue);
331 assert(
nullptr != option);
335 issue +=
"The required option [";
339 issue +=
"] or its argument is missing. ";
341 throw std::runtime_error(issue);
344template <
typename Value,
typename Iterator>
350 size_t maxQty =
static_cast<size_t>(-1)
355 const size_t argQty =
args->size();
357 if (minQty <= argQty && maxQty >= argQty)
361 std::transform(
args->begin(),
args->end(), target, converter);
374template <
typename Value>
377 Value value = defaultValue;
384template <
typename Value,
size_t Length>
390template <
typename Value>
395 if (
nullptr ==
args || 1 !=
args->size())
402 return converter((*
args)[0]);
414 void show(std::ostream& out)
const
416 out <<
"Options affecting the application behavior: " << std::endl;
418 out <<
" --help" << std::endl <<
"\tDisplays this message. " << std::endl;
438 assert(
nullptr != option);
440 return (
nullptr !=
options.args(option));
480 <<
" --host [host]" << std::endl
481 <<
"\tIf not specified, an emulator is used." << std::endl
482 <<
" --port [port]" << std::endl;
503 <<
" --settings [settings]" << std::endl
504 <<
"\tSettings file." << std::endl;
525 <<
" --nif <nif>" << std::endl
526 <<
"\tNetwork interface." << std::endl;
567 <<
" --clientId [clientId]" << std::endl
568 <<
" --userId [userId]" << std::endl
569 <<
" --password [password]" << std::endl
570 <<
" --traderId [traderId]" << std::endl
571 <<
" --traderPwd [traderPwd]" << std::endl;
578 ONIXS_ICEBOE_NAMESPACE::SessionStorageType::Enum
storage()
const
597 virtual ONIXS_ICEBOE_NAMESPACE::SessionStorageType::Enum
defaultStorage()
const = 0;
602 <<
" --storage [FileBased|AsyncFileBased|MemoryBased]" << std::endl
604 <<
" --storageCpu <cpu>" << std::endl
605 <<
"\tAsyncFileBased storage CPU affinity" << std::endl
610template <ONIXS_ICEBOE_NAMESPACE::SessionStorageType::Enum DefaultStorage>
616 return DefaultStorage;
643 <<
" --mainThreadCpu [mainThreadCpu]" << std::endl
665 <<
" --receivingThreadCpu [mainThreadCpu]" << std::endl
696 std::cerr <<
"Please use the RELEASE build for benchmarking." << std::endl;
698#if !defined(ONIXS_DEBUGGING)
708 <<
" --numberOfMessages [number]" << std::endl
710 <<
" --warmupInterval [number]" << std::endl
712 <<
" --warmupInterval [number]" << std::endl
718template <
typename... Bases>
723 , Bases(argc, argv)...
725 out <<
"OnixS ICE Binary Order Entry C++ '" << name <<
"' Sample, version " <<
Session::version() <<
'.' << std::endl;
757 <<
" --location <FileName|DirectoryName>" << std::endl;
#define ONIXS_ICEBOE_UNUSED
static const char * version() noexcept
static BuildInfo library() noexcept
Returns build info for the library binary itself.
const char * operator*() const
ArgCarriage(size_t qty, char **args) noexcept
size_t intervalBetweenSending() const
size_t numberOfMessages() const
BenchmarkConfiguration(size_t qty, char **args)
size_t warmupInterval() const
void showOptions(std::ostream &out) const override
virtual ~ConfigurationBase()=default
const Options & options() const noexcept
virtual void showOptions(std::ostream &) const =0
ConfigurationBase(size_t qty, char **args) noexcept
static bool exist(const Options &options, const Char *option)
void show(std::ostream &out) const
ConnectivityConfiguration(size_t qty, char **args)
void showOptions(std::ostream &out) const override
LogonConfiguration(size_t qty, char **args)
std::string traderPwd() const
std::string password() const
std::string traderId() const
std::string userId() const
void showOptions(std::ostream &out) const override
Threading::CpuIndex mainThreadCpu() const
MainThreadAffinityConfiguration(size_t qty, char **args)
void showOptions(std::ostream &out) const override
NetworkInterfaceConfiguration(size_t qty, char **args)
void showOptions(std::ostream &out) const override
OptionArgConverter(const Char *=nullptr)
const Char * operator()(const std::string &str) const
OptionArgConverter(const Char *=nullptr)
std::string operator()(const std::string &str) const
Value operator()(const std::string &str) const
OptionArgConverter(const Char *option=nullptr)
const OptionArgs * args(const std::string &option) const
const OptionArgs * args(const char *option) const
Options(size_t qty, char **args)
void get(Iterator target) const
ReceivingThreadAffinityConfiguration(size_t qty, char **args)
Threading::CpuIndex receivingThreadCpu() const
void showOptions(std::ostream &out) const override
SettingsConfiguration(size_t qty, char **args)
void showOptions(std::ostream &out) const override
std::string settingsFile() const
OnixS::ICE::BOE::CpuIndex storageAffinity() const
virtual OnixS::ICE::BOE::SessionStorageType::Enum defaultStorage() const =0
StorageConfigurationBase(size_t qty, char **args)
OnixS::ICE::BOE::SessionStorageType::Enum storage() const
void showOptions(std::ostream &out) const override
OnixS::ICE::BOE::SessionStorageType::Enum defaultStorage() const override
StorageConfiguration(size_t qty, char **args)
char Char
Character type alias.
std::basic_string_view< Char > StrRef
StrRef toStrRef(const std::string &str)
Constructs a StrRef instance over th std::string content.
bool fromStr(Decimal &, const Char *, size_t) noexcept
Deserializes a decimal number from the given text presentation.
size_t CpuIndex
Logical processors that a thread is allowed to run on (first logical CPU has index 0).
constexpr Threading::CpuIndex ReceivingThreadCpuAffinity
constexpr Threading::CpuIndex NumberOfMessages
constexpr Threading::CpuIndex MainThreadCpuAffinity
constexpr const char * UserId
constexpr size_t IntervalBetweenSending
constexpr const char * TraderId
constexpr size_t WarmupInterval
constexpr const char * Password
constexpr const char * TraderPassword
Value argOrDefault(const Options &options, const Char *option, const Value &defaultValue=Value())
std::vector< OptionArg > OptionArgs
Value requiredArg(const Options &options, const Char *option)
bool args(const Options &options, const Char *option, Iterator target, size_t minQty=0, size_t maxQty=static_cast< size_t >(-1))
void throwOptionArgConversionFailed(const Char *option)
void throwDuplicatedOption(const Char *option)
std::string toStr(Order::PriceOptional value)
void convertOptionArg(Value &value, const Char *option, const std::string &str)
void throwBadOptionArgQty(const Char *option, size_t argQty, size_t minQty, size_t maxQty)
void throwBadOption(const Char *arg)
void throwReqiredOptionArgMissing(const Char *option)
T fromStr(const std::string &s)
static Enum parse(const std::string &)
@ AsyncFileBased
Asynchronous File-Based Session Storage.
static const char * toString(SessionStorageType::Enum)
AppConfiguration(const char *name, int argc, char **argv, std::ostream &out=std::clog)
void showOptions(std::ostream &out) const override