1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3 * This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
6 */
7
8 #include "xml_context_global.hpp"
9 #include "orcus/string_pool.hpp"
10 #include "orcus/measurement.hpp"
11
12 #include <algorithm>
13
14 namespace orcus {
15
single_attr_getter(string_pool & pool,xmlns_id_t ns,xml_token_t name)16 single_attr_getter::single_attr_getter(string_pool& pool, xmlns_id_t ns, xml_token_t name) :
17 m_pool(&pool), m_ns(ns), m_name(name) {}
18
single_attr_getter(xmlns_id_t ns,xml_token_t name)19 single_attr_getter::single_attr_getter(xmlns_id_t ns, xml_token_t name) :
20 m_pool(nullptr), m_ns(ns), m_name(name) {}
21
operator ()(const xml_token_attr_t & attr)22 void single_attr_getter::operator() (const xml_token_attr_t& attr)
23 {
24 if (attr.name != m_name)
25 return;
26
27 if (attr.ns && attr.ns != m_ns)
28 return;
29
30 m_value = attr.value;
31 if (attr.transient && m_pool)
32 m_value = m_pool->intern(m_value).first;
33 }
34
get_value() const35 pstring single_attr_getter::get_value() const
36 {
37 return m_value;
38 }
39
get(const std::vector<xml_token_attr_t> & attrs,xmlns_id_t ns,xml_token_t name)40 pstring single_attr_getter::get(
41 const std::vector<xml_token_attr_t>& attrs, xmlns_id_t ns, xml_token_t name)
42 {
43 single_attr_getter func(ns, name);
44 return std::for_each(attrs.begin(), attrs.end(), func).get_value();
45 }
46
get(const std::vector<xml_token_attr_t> & attrs,string_pool & pool,xmlns_id_t ns,xml_token_t name)47 pstring single_attr_getter::get(
48 const std::vector<xml_token_attr_t>& attrs, string_pool& pool, xmlns_id_t ns, xml_token_t name)
49 {
50 single_attr_getter func(pool, ns, name);
51 return std::for_each(attrs.begin(), attrs.end(), func).get_value();
52 }
53
single_long_attr_getter(xmlns_id_t ns,xml_token_t name)54 single_long_attr_getter::single_long_attr_getter(xmlns_id_t ns, xml_token_t name) :
55 m_value(-1), m_ns(ns), m_name(name) {}
56
operator ()(const xml_token_attr_t & attr)57 void single_long_attr_getter::operator() (const xml_token_attr_t& attr)
58 {
59 if (attr.name != m_name)
60 return;
61
62 if (attr.ns && attr.ns != m_ns)
63 return;
64
65 m_value = to_long(attr.value);
66 }
67
get_value() const68 long single_long_attr_getter::get_value() const
69 {
70 return m_value;
71 }
72
get(const std::vector<xml_token_attr_t> & attrs,xmlns_id_t ns,xml_token_t name)73 long single_long_attr_getter::get(const std::vector<xml_token_attr_t>& attrs, xmlns_id_t ns, xml_token_t name)
74 {
75 single_long_attr_getter func(ns, name);
76 return std::for_each(attrs.begin(), attrs.end(), func).get_value();
77 }
78
single_double_attr_getter(xmlns_id_t ns,xml_token_t name)79 single_double_attr_getter::single_double_attr_getter(xmlns_id_t ns, xml_token_t name) :
80 m_value(-1.0), m_ns(ns), m_name(name) {}
81
operator ()(const xml_token_attr_t & attr)82 void single_double_attr_getter::operator() (const xml_token_attr_t& attr)
83 {
84 if (attr.name != m_name)
85 return;
86
87 if (attr.ns && attr.ns != m_ns)
88 return;
89
90 m_value = to_double(attr.value);
91 }
92
get_value() const93 double single_double_attr_getter::get_value() const
94 {
95 return m_value;
96 }
97
get(const std::vector<xml_token_attr_t> & attrs,xmlns_id_t ns,xml_token_t name)98 double single_double_attr_getter::get(const std::vector<xml_token_attr_t>& attrs, xmlns_id_t ns, xml_token_t name)
99 {
100 single_double_attr_getter func(ns, name);
101 return std::for_each(attrs.begin(), attrs.end(), func).get_value();
102 }
103
104 }
105
106 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
107