1 // -*- C++ -*-
2 /*****************************************************************************\
3  * Copyright (c) 2004 Mark Aylett <mark@emantic.co.uk>                       *
4  *                                                                           *
5  * Permission is hereby granted, free of charge, to any person obtaining a   *
6  * copy of this software and associated documentation files (the             *
7  * "Software"), to deal in the Software without restriction, including       *
8  * without limitation the rights to use, copy, modify, merge, publish,       *
9  * distribute, sublicense, and/or sell copies of the Software, and to permit *
10  * persons to whom the Software is furnished to do so, subject to the        *
11  * following conditions:                                                     *
12  *                                                                           *
13  * The above copyright notice and this permission notice shall be included   *
14  * in all copies or substantial portions of the Software.                    *
15  *                                                                           *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS   *
17  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF                *
18  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN *
19  * NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,  *
20  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR     *
21  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE *
22  * USE OR OTHER DEALINGS IN THE SOFTWARE.                                    *
23 \*****************************************************************************/
24 
25 /**
26  * \file mar_util_cpp.h
27  * \brief TODO
28  */
29 
30 #ifndef INCLUDED_MAR_UTIL_CPP
31 #define INCLUDED_MAR_UTIL_CPP
32 
33 #ifndef INCLUDED_MAR_ARCHIVE_CPP
34 #include "mar_archive_cpp.h"
35 #endif // INCLUDED_MAR_ARCHIVE_CPP
36 
37 #ifndef INCLUDED_MAR_EXCEPTION_CPP
38 #include "mar_exception_cpp.h"
39 #endif // INCLUDED_MAR_EXCEPTION_CPP
40 
41 namespace mar {
42 
43     inline bool
result(int ret)44     result(int ret)
45     {
46         if (-1 == ret)
47             throw error();
48         return MAR_NOMATCH != ret;
49     }
50 
51     // Creational.
52 
53     inline archive
create()54     create()
55     {
56         archive ar(archive::create());
57         if (!ar)
58             throw error();
59         return ar;
60     }
61     inline archive
open(const char * path,int flags)62     open(const char* path, int flags)
63     {
64         archive ar(archive::open(path, flags));
65         if (!ar)
66             throw error();
67         return ar;
68     }
69     inline archive
open(const char * path,int flags,mode_t mode)70     open(const char* path, int flags, mode_t mode)
71     {
72         archive ar(archive::open(path, flags, mode));
73         if (!ar)
74             throw error();
75         return ar;
76     }
77     inline archive
78     opencopy(const char* path, const char* master,
79              int flags = rdwr | creat | excl, mode_t mode = 0664)
80     {
81         archive ar(archive::opencopy(path, master, flags, mode));
82         if (!ar)
83             throw error();
84         return ar;
85     }
86     inline void
copy(archive & dst,const archive & src)87     copy(archive& dst, const archive& src)
88     {
89         if (-1 == dst.copy(src))
90             throw error();
91     }
92     inline void
release(archive & ar)93     release(archive& ar)
94     {
95         if (-1 == ar.release())
96             throw error();
97     }
98 
99     // Meta Modifiers.
100 
101     inline void
removepairs(archive & ar)102     removepairs(archive& ar)
103     {
104         if (-1 == ar.removepairs())
105             throw error();
106     }
107     inline void
setmeta(archive & ar,size_t ord,const void * data,size_t size)108     setmeta(archive& ar, size_t ord, const void* data, size_t size)
109     {
110         if (-1 == ar.setmeta(ord, data, size))
111             throw error();
112     }
113     inline void
setmeta(archive & ar,size_t ord,const char * data)114     setmeta(archive& ar, size_t ord, const char* data)
115     {
116         setmeta(ar, ord, data, strlen(data));
117     }
118     inline size_t
setmeta(archive & ar,const pair & p)119     setmeta(archive& ar, const pair& p)
120     {
121         size_t ord;
122         if (-1 == ar.setmeta(p, ord))
123             throw error();
124         return ord;
125     }
126     inline std::pair<size_t, bool>
unsetmeta(archive & ar,const char * key)127     unsetmeta(archive& ar, const char* key)
128     {
129         size_t ord;
130         bool match(result(ar.unsetmeta(key, ord)));
131         return std::make_pair(ord, match);
132     }
133     inline bool
unsetmeta(archive & ar,size_t ord)134     unsetmeta(archive& ar, size_t ord)
135     {
136         return result(ar.unsetmeta(ord));
137     }
138 
139     // User Modifiers.
140 
141     inline void
insert(archive & ar,const char * path)142     insert(archive& ar, const char* path)
143     {
144         if (-1 == ar.insert(path))
145             throw error();
146     }
147     inline size_t
read(archive & ar,void * buf,size_t size)148     read(archive& ar, void* buf, size_t size)
149     {
150         ssize_t ret(ar.read(buf, size));
151         if (-1 == ret)
152             throw error();
153         return ret;
154     }
155     inline off_t
seek(archive & ar,off_t offset,int whence)156     seek(archive& ar, off_t offset, int whence)
157     {
158         off_t ret(ar.seek(offset, whence));
159         if (-1 == ret)
160             throw error();
161         return ret;
162     }
163     inline void
setuser(archive & ar,const void * data,size_t size)164     setuser(archive& ar, const void* data, size_t size)
165     {
166         if (-1 == ar.setuser(data, size))
167             throw error();
168     }
169     inline void
setuser(archive & ar,const char * data)170     setuser(archive& ar, const char* data)
171     {
172         setuser(ar, data, strlen(data));
173     }
174     inline void
sync(archive & ar)175     sync(archive& ar)
176     {
177         if (-1 == ar.sync())
178             throw error();
179     }
180     inline void
truncate(archive & ar,size_t size)181     truncate(archive& ar, size_t size)
182     {
183         if (-1 == ar.truncate(size))
184             throw error();
185     }
186     inline size_t
write(archive & ar,const void * buf,size_t size)187     write(archive& ar, const void* buf, size_t size)
188     {
189         ssize_t ret(ar.write(buf, size));
190         if (-1 == ret)
191             throw error();
192         return ret;
193     }
194 
195     // Meta Accessors.
196 
197     inline const void*
meta(const archive & ar,const char * key,size_t & size)198     meta(const archive& ar, const char* key, size_t& size)
199     {
200         const void* ret = ar.meta(key, size);
201         if (!ret)
202             throw error();
203         return ret;
204     }
205     inline const void*
meta(const archive & ar,const char * key)206     meta(const archive& ar, const char* key)
207     {
208         const void* ret = ar.meta(key);
209         if (!ret)
210             throw error();
211         return ret;
212     }
213     inline const void*
meta(const archive & ar,size_t ord,size_t & size)214     meta(const archive& ar, size_t ord, size_t& size)
215     {
216         const void* ret = ar.meta(ord, size);
217         if (!ret)
218             throw error();
219         return ret;
220     }
221     inline const void*
meta(const archive & ar,size_t ord)222     meta(const archive& ar, size_t ord)
223     {
224         const void* ret = ar.meta(ord);
225         if (!ret)
226             throw error();
227         return ret;
228     }
229     inline bool
meta(const archive & ar,pair & p,size_t ord)230     meta(const archive& ar, pair& p, size_t ord)
231     {
232         return result(ar.meta(p, ord));
233     }
234     inline size_t
metapairs(const archive & ar)235     metapairs(const archive& ar)
236     {
237         size_t size;
238         if (-1 == ar.metapairs(size))
239             throw error();
240         return size;
241     }
242     inline bool
tokey(const archive & ar,key & k,size_t ord)243     tokey(const archive& ar, key& k, size_t ord)
244     {
245         return result(ar.tokey(k, ord));
246     }
247     inline std::pair<size_t, bool>
toord(const archive & ar,const char * key)248     toord(const archive& ar, const char* key)
249     {
250         size_t ord;
251         bool match(result(ar.toord(ord, key)));
252         return std::make_pair(ord, match);
253     }
254 
255     // User Accessors.
256 
257     inline void
extract(const archive & ar,const char * path)258     extract(const archive& ar, const char* path)
259     {
260         if (-1 == ar.extract(path))
261             throw error();
262     }
263     inline const void*
user(const archive & ar,size_t & size)264     user(const archive& ar, size_t& size)
265     {
266         const void* ret = ar.user(size);
267         if (!ret)
268             throw error();
269         return ret;
270     }
271     inline const void*
user(const archive & ar)272     user(const archive& ar)
273     {
274         const void* ret = ar.user();
275         if (!ret)
276             throw error();
277         return ret;
278     }
279     inline size_t
usersize(const archive & ar)280     usersize(const archive& ar)
281     {
282         size_t size;
283         if (-1 == ar.usersize(size))
284             throw error();
285         return size;
286     }
287 }
288 
289 #endif // INCLUDED_MAR_UTIL_CPP
290