1
// libTorrent - BitTorrent library
2
// Copyright (C) 2005-2007, Jari Sundell
4
// This program is free software; you can redistribute it and/or modify
5
// it under the terms of the GNU General Public License as published by
6
// the Free Software Foundation; either version 2 of the License, or
7
// (at your option) any later version.
9
// This program is distributed in the hope that it will be useful,
10
// but WITHOUT ANY WARRANTY; without even the implied warranty of
11
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
// GNU General Public License for more details.
14
// You should have received a copy of the GNU General Public License
15
// along with this program; if not, write to the Free Software
16
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18
// In addition, as a special exception, the copyright holders give
19
// permission to link the code of portions of this program with the
20
// OpenSSL library under certain conditions as described in each
21
// individual source file, and distribute linked combinations
24
// You must obey the GNU General Public License in all respects for
25
// all of the code used other than OpenSSL. If you modify file(s)
26
// with this exception, you may extend this exception to your version
27
// of the file(s), but you are not obligated to do so. If you do not
28
// wish to do so, delete this exception statement from your version.
29
// If you delete this exception statement from all source files in the
30
// program, then also delete it here.
32
// Contact: Jari Sundell <jaris@ifi.uio.no>
35
// 3185 Skoppum, NORWAY
37
#ifndef LIBTORRENT_OBJECT_STATIC_MAP_H
38
#define LIBTORRENT_OBJECT_STATIC_MAP_H
42
#include <torrent/object.h>
46
struct static_map_mapping_type {
47
static const size_t max_key_size = 16;
49
bool is_end() const { return key[0] == '\0'; }
50
static bool is_not_key_char(char c) { return c == '\0' || c == ':' || c == '[' || c == '*'; }
52
const char* find_key_end(const char* pos) const { return std::find_if(pos, key + max_key_size, &is_not_key_char); }
55
const char key[max_key_size];
58
struct static_map_entry_type {
59
torrent::Object object;
62
template <typename tmpl_key_type, size_t tmpl_length>
63
class static_map_type {
65
typedef Object value_type;
66
typedef tmpl_key_type key_type;
67
typedef static_map_entry_type entry_type;
68
typedef static_map_mapping_type mapping_type;
70
typedef mapping_type key_list_type[tmpl_length];
71
typedef entry_type value_list_type[tmpl_length];
73
static const size_t size = tmpl_length;
74
static const key_list_type keys;
76
entry_type* values() { return m_values; }
77
const entry_type* values() const { return m_values; }
79
Object& operator [] (key_type key) { return m_values[key].object; }
80
const Object& operator [] (key_type key) const { return m_values[key].object; }
83
value_list_type m_values;
87
// Helper functions/classes for parsing keys:
90
struct static_map_stack_type {
91
void set_key_index(uint32_t start_index, uint32_t end_index, uint32_t delim_size,
92
torrent::Object::type_type type = Object::TYPE_MAP) {
93
key_index = start_index;
94
next_key = end_index + delim_size;
98
void clear() { key_index = 0; next_key = 0; obj_type = Object::TYPE_MAP; }
102
Object::type_type obj_type;
105
typedef std::pair<const static_map_mapping_type*, unsigned int> static_map_key_search_result;
107
// Note that the key for both functions must be null-terminated at
109
const static_map_key_search_result
110
find_key_match(const static_map_mapping_type* first, const static_map_mapping_type* last,
111
const char* key_first, const char* key_last) LIBTORRENT_EXPORT;
113
inline const static_map_key_search_result
114
find_key_match(const static_map_mapping_type* first, const static_map_mapping_type* last,
116
return find_key_match(first, last, key, key + strlen(key));