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