comparison src/Input/adplug/core/database.h @ 0:13389e613d67 trunk

[svn] - initial import of audacious-plugins tree (lots to do)
author nenolod
date Mon, 18 Sep 2006 01:11:49 -0700
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:13389e613d67
1 /*
2 * AdPlug - Replayer for many OPL2/OPL3 audio file formats.
3 * Copyright (c) 1999 - 2003 Simon Peter <dn.tlp@gmx.net>, et al.
4 *
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
9 *
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
14 *
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18 *
19 * database.h - AdPlug database class
20 * Copyright (c) 2002 Riven the Mage <riven@ok.ru>
21 * Copyright (c) 2002, 2003 Simon Peter <dn.tlp@gmx.net>
22 */
23
24 #ifndef H_ADPLUG_DATABASE
25 #define H_ADPLUG_DATABASE
26
27 #include <iostream>
28 #include <string>
29 #include <binio.h>
30
31 class CAdPlugDatabase
32 {
33 public:
34 class CKey
35 {
36 public:
37 unsigned short crc16;
38 unsigned long crc32;
39
40 CKey() {};
41 CKey(binistream &in);
42
43 bool operator==(const CKey &key);
44
45 private:
46 void make(binistream &in);
47 };
48
49 class CRecord
50 {
51 public:
52 typedef enum { Plain, SongInfo, ClockSpeed } RecordType;
53
54 RecordType type;
55 CKey key;
56 std::string filetype, comment;
57
58 static CRecord *factory(RecordType type);
59 static CRecord *factory(binistream &in);
60
61 CRecord() {}
62 virtual ~CRecord() {}
63
64 void write(binostream &out);
65
66 bool user_read(std::istream &in, std::ostream &out);
67 bool user_write(std::ostream &out);
68
69 protected:
70 virtual void read_own(binistream &in) = 0;
71 virtual void write_own(binostream &out) = 0;
72 virtual unsigned long get_size() = 0;
73 virtual bool user_read_own(std::istream &in, std::ostream &out) = 0;
74 virtual bool user_write_own(std::ostream &out) = 0;
75 };
76
77 CAdPlugDatabase();
78 ~CAdPlugDatabase();
79
80 bool load(std::string db_name);
81 bool load(binistream &f);
82 bool save(std::string db_name);
83 bool save(binostream &f);
84
85 bool insert(CRecord *record);
86
87 void wipe(CRecord *record);
88 void wipe();
89
90 CRecord *search(CKey const &key);
91 bool lookup(CKey const &key);
92
93 CRecord *get_record();
94
95 bool go_forward();
96 bool go_backward();
97
98 void goto_begin();
99 void goto_end();
100
101 private:
102 static const unsigned short hash_radix;
103
104 class DB_Bucket
105 {
106 public:
107 unsigned long index;
108 bool deleted;
109 DB_Bucket *chain;
110
111 CRecord *record;
112
113 DB_Bucket(unsigned long nindex, CRecord *newrecord, DB_Bucket *newchain = 0);
114 ~DB_Bucket();
115 };
116
117 DB_Bucket **db_linear;
118 DB_Bucket **db_hashed;
119
120 unsigned long linear_index, linear_logic_length, linear_length;
121
122 unsigned long make_hash(CKey const &key);
123 };
124
125 class CPlainRecord: public CAdPlugDatabase::CRecord
126 {
127 public:
128 CPlainRecord() { type = Plain; }
129
130 protected:
131 virtual void read_own(binistream &in) {}
132 virtual void write_own(binostream &out) {}
133 virtual unsigned long get_size() { return 0; }
134 virtual bool user_read_own(std::istream &in, std::ostream &out) { return true; }
135 virtual bool user_write_own(std::ostream &out) { return true; }
136 };
137
138 class CInfoRecord: public CAdPlugDatabase::CRecord
139 {
140 public:
141 std::string title;
142 std::string author;
143
144 CInfoRecord();
145
146 protected:
147 virtual void read_own(binistream &in);
148 virtual void write_own(binostream &out);
149 virtual unsigned long get_size();
150 virtual bool user_read_own(std::istream &in, std::ostream &out);
151 virtual bool user_write_own(std::ostream &out);
152 };
153
154 class CClockRecord: public CAdPlugDatabase::CRecord
155 {
156 public:
157 float clock;
158
159 CClockRecord();
160
161 protected:
162 virtual void read_own(binistream &in);
163 virtual void write_own(binostream &out);
164 virtual unsigned long get_size();
165 virtual bool user_read_own(std::istream &in, std::ostream &out);
166 virtual bool user_write_own(std::ostream &out);
167 };
168
169 #endif