30 #ifndef _UCOMMON_MEMORY_H_
31 #define _UCOMMON_MEMORY_H_
33 #ifndef _UCOMMON_CONFIG_H_
37 #ifndef _UCOMMON_PROTOCOLS_H_
41 #ifndef _UCOMMON_LINKED_H_
45 #ifndef _UCOMMON_STRING_H_
65 size_t pagesize, align;
68 typedef struct mempage {
103 inline unsigned getPages(
void)
113 inline unsigned getLimit(
void)
120 inline unsigned getAlloc(
void)
133 unsigned utilization(
void);
147 virtual void *_alloc(
size_t size);
173 pthread_mutex_t mutex;
182 virtual void _lock(
void);
187 virtual void _unlock(
void);
225 virtual void dealloc(
void *memory);
235 virtual void *
_alloc(
size_t size);
238 class __EXPORT objectpager :
protected memalloc
247 friend class objectpager;
249 inline void set(member *node)
252 member(LinkedObject **root);
256 inline void *operator*()
const
259 inline void *
get(void)
const
271 objectpager(
size_t objsize,
size_t pagesize = 256);
279 void *
get(
unsigned item);
313 inline objectpager::member *begin(
void)
314 {
return static_cast<objectpager::member *
>(root);};
316 inline operator bool()
317 {
return members > 0;}
319 inline bool operator!()
326 inline unsigned count(
void)
363 inline void set(
member *node)
370 inline const char *operator*()
const
373 inline const char *
get(void)
const
398 const char *
get(
unsigned item);
405 void set(
unsigned item,
const char *
string);
411 void add(
const char *text);
417 void push(
const char *text);
423 void push(
char **text);
429 const char *
pull(
void);
435 const char *
pop(
void);
442 void add(
char **list);
449 void set(
char **list);
463 inline const char *operator[](
unsigned item)
478 inline void operator+=(
const char *text)
486 {
add(text);
return *
this;}
489 {
push(text);
return *
this;}
510 unsigned token(
const char *text,
const char *list,
const char *quote = NULL,
const char *end = NULL);
512 unsigned split(
const char *text,
const char *
string,
unsigned flags = 0);
514 unsigned split(stringex_t& expr,
const char *
string,
unsigned flags = 0);
516 String join(
const char *prefix = NULL,
const char *middle = NULL,
const char *suffix = NULL);
518 inline operator bool()
519 {
return members > 0;}
521 inline bool operator!()
524 inline stringpager& operator=(
char **list)
525 {
set(list);
return *
this;}
527 inline const char *operator*()
530 inline operator char **()
555 virtual bool filter(
const char *filename);
562 bool load(
const char *path);
569 void operator=(
const char *path);
571 inline const char *operator*()
574 inline operator bool()
575 {
return dir != NULL;};
577 inline bool operator!()
578 {
return dir == NULL;};
587 {
return stringpager::get(item);};
589 inline const char *
get(
unsigned item)
590 {
return stringpager::get(item);};
600 typedef struct cpage {
606 cpage_t *first, *last, *current, *freelist;
608 unsigned long ccount;
611 virtual int _putch(
int code);
614 virtual void *
_alloc(
size_t size);
637 void set(
const char *text);
643 void add(
const char *text);
651 size_t get(
char *text,
size_t size);
658 void put(
const char *text,
size_t size);
664 inline unsigned long getUsed(
void)
671 inline char *operator *()
679 {
add(text);
return *
this;};
683 char *request(
size_t *iosize);
685 char *
copy(
size_t *iosize);
774 pthread_mutex_t mutex;
794 size_t inp, out, size;
801 charmem(
char *mem,
size_t size);
802 charmem(
size_t size);
808 void set(
char *mem,
size_t size);
810 void set(
size_t size);
812 inline void reset(
void)
815 inline void rewind(
void)
819 class __EXPORT chartext :
public CharacterProtocol
825 int _putch(
int code);
831 chartext(
char *buf,
size_t size);
858 keydata(
keyassoc *assoc,
char *
id,
unsigned max,
unsigned bufsize);
861 friend class keydata;
876 void *allocate(
char *name,
size_t size);
885 keyassoc(
unsigned indexing = 177,
size_t max = 0,
size_t page = 0);
896 inline unsigned getCount(
void)
904 inline void *operator()(
const char *name)
905 {
return locate(name);};
917 void *locate(
const char *name);
926 bool assign(
char *name,
void *
pointer);
934 bool create(
char *name,
void *
pointer);
942 void *
remove(
const char *name);
945 template <
class T,
size_t P = 0>
946 class listof :
private objectpager
949 inline listof() : objectpager(sizeof(T), P) {};
951 inline T& operator[](
unsigned item)
const
952 {
return (T&)objectpager::get(item);}
954 inline T* operator()(
unsigned item)
const
955 {
return (T*)objectpager::get(item);}
957 inline T*
get(
unsigned item)
const
958 {
return (T*)objectpager::get(item);}
966 inline operator T**()
967 {
return (T**)objectpager::list();}
969 inline T** list(
void)
970 {
return (T**)objectpager::list();}
972 inline T* operator++(
void)
975 inline T*
add(
const T&
object)
976 {T* tmp =
objectpager::add();
if(tmp)
new((caddr_t)tmp) T(
object);
return tmp;}
978 inline T*
push(
const T&
object)
981 inline listof& operator<<(
const T&
object)
982 {T* tmp =
objectpager::add();
if(tmp)
new((caddr_t)tmp) T(
object);
return *
this;}
984 inline listof& operator>>(
const T&
object)
985 {T* tmp =
objectpager::push();
if(tmp)
new((caddr_t)tmp) T(
object);
return *
this;}
989 template <
class T,
unsigned I = 177,
size_t M = 0,
size_t P = 0>
990 class mapof :
private keyassoc
996 inline mapof() : keyassoc(I, M, P) {};
1002 inline unsigned getCount(
void)
1003 {
return keyassoc::getCount();};
1008 inline void purge(
void)
1009 {keyassoc::purge();};
1016 inline T *locate(
const char *name)
1017 {
return static_cast<T*
>(keyassoc::locate(name));}
1019 inline T *operator[](
const char *name)
1020 {
return static_cast<T*
>(keyassoc::locate(name));}
1027 inline T *operator()(
const char *name)
1028 {
return locate(name);};
1034 inline T *map(
char *name)
1035 {T *tmp = keyassoc::allocate(name,
sizeof(T));
if(tmp)
new((caddr_t)tmp) T;}
1042 inline void unmap(
char *name)
1050 inline unsigned utilization(
void)
1051 {
return mempager::utilization();};
1059 inline unsigned getPages(
void)
1060 {
return mempager::getPages();};
1070 template <
class T,
unsigned I = 177,
size_t M = 0,
size_t P = 0>
1083 inline unsigned getCount(
void)
1084 {
return keyassoc::getCount();}
1089 inline void purge(
void)
1090 {keyassoc::purge();}
1097 inline T *locate(
const char *name)
1098 {
return static_cast<T*
>(keyassoc::locate(name));}
1100 inline T *operator[](
const char *name)
1101 {
return static_cast<T*
>(keyassoc::locate(name));}
1109 inline T *operator()(
const char *name)
1110 {
return locate(name);}
1120 {
return keyassoc::assign(name, pointer);}
1129 {
return keyassoc::create(name, pointer);}
1136 inline void remove(
char *name)
1144 inline unsigned utilization(
void)
1145 {
return mempager::utilization();}
1153 inline unsigned getPages(
void)
1154 {
return mempager::getPages();}
1163 template <
typename T>
1177 {mempager::purge();};
1183 inline T *operator()(
void)
1184 {
return new(
get(
sizeof(T))) T;};
1190 inline T *operator*()
1191 {
return new(
get(
sizeof(T))) T;};
1199 template <
class T,
unsigned M = 177>
1216 {NamedObject::purge(idx, M); mempager::purge();};
1224 inline T *
get(
const char *name)
const {
1225 T *node = (
static_cast<T*
>(NamedObject::map(idx, name, M)));
1227 node = init<T>(
static_cast<T*
>(mempager::_alloc(
sizeof(T))));
1228 node->NamedObject::add(idx, name, M);
1238 bool test(
const char *name)
const
1239 {
return NamedObject::map(idx, name, M) != NULL;};
1247 inline T *operator[](
const char *name)
const
1248 {
return get(name);};
1254 inline T *begin(
void)
const
1255 {
return static_cast<T*
>(NamedObject::skip(idx, NULL, M));};
1262 inline T *next(T *current)
const
1263 {
return static_cast<T*
>(NamedObject::skip(idx, current, M));};
1269 inline unsigned count(
void)
const
1270 {
return NamedObject::count(idx, M);};
1278 inline T **index(
void)
const
1279 {
return NamedObject::index(idx, M);};
1287 inline T **sort(
void)
const
1288 {
return NamedObject::sort(NamedObject::index(idx, M));};
1306 inline const char *shift(stringlist_t& list)
1307 {
return list.
pull();}
1309 inline void unshift(stringlist_t& list,
const char *text)
1313 inline String str(stringpager& list,
const char *prefix = NULL,
const char *middle = NULL,
const char *suffix = NULL)
1314 {
return list.join(prefix, middle, suffix);}