21using namespace std::string_literals;
23template<>
bool RAttrMap::Value_t::Get<bool>()
const {
return GetBool(); }
24template<>
int RAttrMap::Value_t::Get<int>()
const {
return GetInt(); }
25template<>
double RAttrMap::Value_t::Get<double>()
const {
return GetDouble(); }
26template<> std::string RAttrMap::Value_t::Get<std::string>()
const {
return GetString(); }
27template<>
RPadLength RAttrMap::Value_t::Get<RPadLength>()
const {
return GetString(); }
28template<>
RColor RAttrMap::Value_t::Get<RColor>()
const {
return GetString(); }
30template<>
bool RAttrMap::Value_t::GetValue<bool,void>(
const Value_t *rec) {
return rec ? rec->
GetBool() :
false; }
31template<>
int RAttrMap::Value_t::GetValue<int,void>(
const Value_t *rec) {
return rec ? rec->
GetInt() : 0; }
32template<>
double RAttrMap::Value_t::GetValue<double,void>(
const Value_t *rec) {
return rec ? rec->GetDouble() : 0.; }
33template<> std::string RAttrMap::Value_t::GetValue<std::string,void>(
const Value_t *rec) {
return rec ? rec->GetString() :
""s; }
34template<>
RPadLength RAttrMap::Value_t::GetValue<RPadLength,void>(
const Value_t *rec) {
return rec ? rec->GetString() :
""s; }
35template<>
RColor RAttrMap::Value_t::GetValue<RColor,void>(
const Value_t *rec) {
return rec ? rec->GetString() :
""s; }
37template<>
const RAttrMap::Value_t *RAttrMap::Value_t::GetValue<const RAttrMap::Value_t *,void>(
const Value_t *rec) {
return rec; }
56 if (!prefix.empty()) prefix.append(
"_");
59 for (
auto &entry : defaults.
m)
60 m[prefix + entry.first] = std::move(entry.second);
76 if (
value ==
"true"s) {
81 if (
value ==
"false"s) {
86 auto beg =
value.begin();
88 bool int_conversion_fails =
false;
92 }
else if ((
value.length() > 2) && (*beg ==
'0') && (
value[1] ==
'x')) {
98 if (std::find_if(beg,
value.end(), [](
unsigned char c) { return !std::isdigit(c); }) ==
value.end()) {
102 auto ivalue = std::stoll(base == 16 ?
value.substr(2) :
value,
nullptr, base);
104 if ((ivalue >= std::numeric_limits<int>::min()) && (ivalue <= std::numeric_limits<int>::max()))
112 int_conversion_fails =
true;
117 if (!int_conversion_fails && std::find_if(beg,
value.end(), [](
unsigned char c) {
118 return !std::isdigit(c) && (c !=
'.') && (c !=
'-') && (c !=
'+') && (c !=
'e');
121 double dvalue = std::stod(
value);
139 auto entry =
m.find(
name);
140 if ((entry ==
m.end()) || (entry->second->Kind() ==
kNoValue)) {
141 if (!
value)
return false;
153 if(!
value->CanConvertTo(entry->second->Kind())) {
159 if (entry->second->IsEqual(*
value))
162 switch (entry->second->Kind()) {
#define R__LOG_ERROR(...)
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void value
Base class for attributes aggregations like lines or fill attributes.
Base class for all attributes, used with RDrawable.
const char * GetPrefix() const
virtual RAttrMap CollectDefaults() const =0
virtual bool CanConvertTo(EValuesKind kind) const
virtual bool GetBool() const
virtual int GetInt() const
RAttrMap & AddString(const std::string &name, const std::string &value)
RAttrMap & AddDouble(const std::string &name, double value)
RAttrMap & AddNoValue(const std::string &name)
std::unordered_map< std::string, std::unique_ptr< Value_t > > m
JSON_object.
RAttrMap & AddInt(const std::string &name, int value)
bool Change(const std::string &name, Value_t *value=nullptr)
Change attribute using string value and kind Used to change attributes from JS side Returns true if v...
RAttrMap & AddBool(const std::string &name, bool value)
RAttrMap & AddDefaults(const RAttrBase &vis)
Add defaults values form sub attribute.
void AddBestMatch(const std::string &name, const std::string &value)
Add attribute, converting to best possible type Tested boolean, int, double.
RLogChannel & GPadLog()
Log channel for GPad diagnostics.