31#ifndef _UCOMMON_MEMORY_H_
32#define _UCOMMON_MEMORY_H_
34#ifndef _UCOMMON_CONFIG_H_
38#ifndef _UCOMMON_PROTOCOLS_H_
42#ifndef _UCOMMON_LINKED_H_
46#ifndef _UCOMMON_STRING_H_
61class __EXPORT memalloc :
public __PROTOCOL MemoryProtocol
64 friend class bufpager;
66 size_t pagesize, align;
69 typedef struct mempage {
93 memalloc(
size_t page = 0);
95 memalloc(
const memalloc& copy);
106 inline unsigned pages(
void)
const {
117 inline unsigned max(
void)
const {
125 inline size_t size(
void)
const {
139 unsigned utilization(
void)
const;
154 virtual void *_alloc(
size_t size) __OVERRIDE;
161 void assign(memalloc& source);
184class __EXPORT mempager :
public memalloc,
public __PROTOCOL LockingProtocol
187 mutable pthread_mutex_t mutex;
196 virtual void _lock(
void) __OVERRIDE;
201 virtual void _unlock(
void) __OVERRIDE;
208 mempager(
size_t page = 0);
210 mempager(
const mempager& copy);
227 unsigned utilization(
void);
241 virtual void dealloc(
void *memory);
252 virtual void *_alloc(
size_t size) __OVERRIDE;
259 void assign(mempager& source);
262class __EXPORT ObjectPager :
protected memalloc
265 class __EXPORT member :
public LinkedObject
271 friend class ObjectPager;
273 inline void set(member *node) {
277 inline void *get(
void)
const {
281 member(LinkedObject **root);
285 inline void *operator*()
const {
297 __DELETE_COPY(ObjectPager);
300 ObjectPager(
size_t objsize,
size_t pagesize = 256);
308 void *get(
unsigned item)
const;
334 void *invalid(
void)
const;
348 inline ObjectPager::member *begin(
void) {
349 return static_cast<ObjectPager::member *
>(root);
352 inline operator bool()
const {
356 inline bool operator!()
const {
364 inline unsigned count(
void)
const {
371 typedef linked_pointer<ObjectPager::member> iterator;
373 inline size_t size(
void) {
374 return memalloc::size();
377 inline unsigned pages(
void) {
378 return memalloc::pages();
393 void assign(ObjectPager& source);
401class __EXPORT StringPager :
protected memalloc
415 virtual bool filter(
char *text,
size_t size);
423 class __EXPORT member :
public LinkedObject
429 friend class StringPager;
431 inline void set(member *node)
434 member(LinkedObject **root,
const char *data);
435 member(
const char *data);
438 inline const char *operator*()
const {
442 inline const char *get(
void)
const {
451 StringPager(
size_t pagesize = 256);
453 StringPager(
char **list,
size_t pagesize = 256);
459 inline unsigned count(
void)
const {
469 const char *get(
unsigned item)
const;
476 void set(
unsigned item,
const char *
string);
482 void add(
const char *text);
488 void push(
const char *text);
494 void push(
char **text);
500 const char *pull(
void);
506 const char *pop(
void);
513 void add(
char **list);
520 void set(
char **list);
534 inline const char *operator[](
unsigned item)
const {
538 inline const char *at(
unsigned item)
const {
547 inline StringPager::member *begin(
void)
const {
548 return static_cast<StringPager::member *
>(root);
555 inline void operator+=(
const char *text) {
563 inline StringPager& operator<<(
const char *text) {
568 inline StringPager& operator>>(
const char *text) {
592 unsigned token(
const char *text,
const char *list,
const char *quote = NULL,
const char *end = NULL);
594 unsigned split(
const char *text,
const char *
string,
unsigned flags = 0);
596 unsigned split(stringex_t& expr,
const char *
string,
unsigned flags = 0);
598 String join(
const char *prefix = NULL,
const char *middle = NULL,
const char *suffix = NULL);
600 inline operator bool()
const {
604 inline bool operator!()
const {
608 inline StringPager& operator=(
char **list) {
613 inline const char *operator*() {
617 inline operator char **() {
624 typedef linked_pointer<StringPager::member> iterator;
626 inline size_t size(
void)
const {
627 return memalloc::size();
630 inline unsigned pages(
void)
const {
631 return memalloc::pages();
643 void assign(StringPager& source);
653class __EXPORT DirPager :
protected StringPager
656 __DELETE_COPY(DirPager);
668 virtual bool filter(
char *filename,
size_t size) __OVERRIDE;
675 bool load(
const char *path);
680 DirPager(
const char *path);
682 void operator=(
const char *path);
684 inline const char *operator*()
const {
688 inline operator bool()
const {
692 inline bool operator!()
const {
696 inline unsigned count(
void)
const {
697 return StringPager::count();
706 inline const char *operator[](
unsigned item)
const {
707 return StringPager::get(item);
710 inline const char *get(
unsigned item)
const {
711 return StringPager::get(item);
714 inline const char *at(
unsigned item)
const {
715 return StringPager::get(item);
718 inline size_t size(
void)
const {
719 return memalloc::size();
722 inline unsigned pages(
void)
const {
723 return memalloc::pages();
731 void assign(DirPager& source);
741class __EXPORT autorelease
746 __DELETE_COPY(autorelease);
770 void operator+=(LinkedObject *
object);
783class __EXPORT PagerObject :
public LinkedObject,
public CountedObject
786 __DELETE_COPY(PagerObject);
789 friend class PagerPool;
803 void retain(
void) __OVERRIDE;
808 void release(
void) __OVERRIDE;
813 void dealloc(
void) __OVERRIDE;
824class __EXPORT PagerPool :
public __PROTOCOL MemoryProtocol
827 LinkedObject *freelist;
828 mutable pthread_mutex_t mutex;
830 __DELETE_COPY(PagerPool);
834 virtual ~PagerPool();
836 PagerObject *get(
size_t size);
843 void put(PagerObject *
object);
853class pager :
private MemoryRedirect,
private PagerPool
856 __DELETE_COPY(
pager);
863 inline pager(mempager *heap = NULL) : MemoryRedirect(heap), PagerPool() {}
870 return new(get(
sizeof(T))) T;
878 return new(get(
sizeof(T))) T;
897inline String str(StringPager& list,
const char *prefix = NULL,
const char *middle = NULL,
const char *suffix = NULL) {
898 return list.join(prefix, middle, suffix);
Linked objects, lists, templates, and containers.
Various miscellaneous platform specific headers and defines.
Abstract interfaces and support.
Common namespace for all ucommon objects.
DirPager dirlist_t
A convenience type for using DirPager directly.
T &() max(T &o1, T &o2)
Convenience function to return max of two objects.
T &() limit(T &value, T &low, T &high)
Convenience macro to range restrict values.
StringPager stringlist_t
A convenience type for paged string lists.
StringPager::member stringlistitem_t
A convenience type for paged string list items.
This is a base class for objects that may be created in pager pools.
pager(mempager *heap=NULL)
Construct a pager and optionally assign a private pager heap.
T * operator()(void)
Create a managed object by casting reference.
T * operator*()
Create a managed object by pointer reference.
A common string class and character string support functions.