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