18 inline std::string html_escape(
const std::string& data ){
20 buffer.reserve(data.size());
21 for(std::size_t pos = 0; pos != data.size(); ++pos) {
23 case '&': buffer.append(
"&");
break;
24 case '\"': buffer.append(
""");
break;
25 case '\'': buffer.append(
"'");
break;
26 case '<': buffer.append(
"<");
break;
27 case '>': buffer.append(
">");
break;
28 default: buffer.append(&data[pos], 1);
break;
34namespace plot::util::details {
35 template <
typename Base> std::true_type is_base_of_test_func(Base*);
36 template <
typename Base> std::false_type is_base_of_test_func(
void*);
37 template <
typename Base,
typename Derived>
38 using pre_is_base_of =
decltype(is_base_of_test_func<Base>(std::declval<Derived*>()));
40 template <
typename Base,
typename Derived,
typename =
void>
41 struct pre_is_base_of2 :
public std::true_type { };
43 template <
typename Base,
typename Derived>
44 struct pre_is_base_of2<Base, Derived, std::void_t<pre_is_base_of<Base, Derived>>> :
45 public pre_is_base_of<Base, Derived> { };
49template <
typename Base,
typename Derived>
51 public std::conditional_t<
52 std::is_class<Base>::value && std::is_class<Derived>::value,
53 details::pre_is_base_of2<Base, Derived>,
58namespace plot::utils {
59 inline std::size_t size_of_max_value(
const std::vector<std::string>& lbl ){
60 auto it = std::max_element( std::begin(lbl), std::end(lbl),
61 [](
const auto& a,
const auto& b) ->
bool {
62 return a.size() < b.size();