]> 4ch.mooo.com Git - 16.git/blob - 16/adplug/adplug/src/database.h
wwww~
[16.git] / 16 / adplug / adplug / src / database.h
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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  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