diff options
author | Mike Buland <eichlan@xagasoft.com> | 2007-10-03 09:13:28 +0000 |
---|---|---|
committer | Mike Buland <eichlan@xagasoft.com> | 2007-10-03 09:13:28 +0000 |
commit | b3eef5b0b82c20a9f11868ba376f6bb2d94faae4 (patch) | |
tree | 7c5f4243d3a528f86daad826ed886dea6b816871 | |
parent | 850ebb96df909a4113fdf9c5bf82cf0f598901ca (diff) | |
download | libbu++-b3eef5b0b82c20a9f11868ba376f6bb2d94faae4.tar.gz libbu++-b3eef5b0b82c20a9f11868ba376f6bb2d94faae4.tar.bz2 libbu++-b3eef5b0b82c20a9f11868ba376f6bb2d94faae4.tar.xz libbu++-b3eef5b0b82c20a9f11868ba376f6bb2d94faae4.zip |
Nothing about function. I added a bunch of docs and re-arranged a bunch of
the existing docs. Taking advantage of some of the cooler extra features of
doxygen I've started writing extra how-to pages covering working with sections
of the library. Also, I started grouping the classes by function so they show
up on the Modules page together, very cute.
Diffstat (limited to '')
-rw-r--r-- | Doxyfile | 2 | ||||
-rw-r--r-- | src/array.h | 1 | ||||
-rw-r--r-- | src/atom.h | 1 | ||||
-rw-r--r-- | src/client.h | 3 | ||||
-rw-r--r-- | src/doxy/archives.dox | 9 | ||||
-rw-r--r-- | src/doxy/groups.dox | 19 | ||||
-rw-r--r-- | src/doxy/main.dox (renamed from src/main.dox) | 7 | ||||
-rw-r--r-- | src/doxy/servers.dox | 11 | ||||
-rw-r--r-- | src/doxy/streams.dox | 158 | ||||
-rw-r--r-- | src/doxy/threading.dox | 15 | ||||
-rw-r--r-- | src/hash.h | 1 | ||||
-rw-r--r-- | src/ito.h | 63 | ||||
-rw-r--r-- | src/itoatom.h | 1 | ||||
-rw-r--r-- | src/itocondition.h | 33 | ||||
-rw-r--r-- | src/itomutex.h | 37 | ||||
-rw-r--r-- | src/itoqueue.h | 61 | ||||
-rw-r--r-- | src/itoserver.h | 2 | ||||
-rw-r--r-- | src/list.h | 1 | ||||
-rw-r--r-- | src/protocol.h | 3 | ||||
-rw-r--r-- | src/ringbuffer.h | 3 | ||||
-rw-r--r-- | src/server.h | 2 | ||||
-rw-r--r-- | src/serversocket.h | 3 | ||||
-rw-r--r-- | src/set.h | 1 | ||||
-rw-r--r-- | src/socket.h | 3 | ||||
-rw-r--r-- | src/sptr.h | 3 | ||||
-rw-r--r-- | src/tafnode.h | 13 | ||||
-rw-r--r-- | src/tafreader.h | 1 | ||||
-rw-r--r-- | src/tafwriter.h | 1 | ||||
-rw-r--r-- | src/tests/size.cpp | 13 |
29 files changed, 375 insertions, 96 deletions
@@ -80,7 +80,7 @@ WARN_LOGFILE = Doxywarn | |||
80 | #--------------------------------------------------------------------------- | 80 | #--------------------------------------------------------------------------- |
81 | # configuration options related to the input files | 81 | # configuration options related to the input files |
82 | #--------------------------------------------------------------------------- | 82 | #--------------------------------------------------------------------------- |
83 | INPUT = src | 83 | INPUT = src src/doxy |
84 | FILE_PATTERNS = *.c \ | 84 | FILE_PATTERNS = *.c \ |
85 | *.cc \ | 85 | *.cc \ |
86 | *.cxx \ | 86 | *.cxx \ |
diff --git a/src/array.h b/src/array.h index 43892ee..75c5dd3 100644 --- a/src/array.h +++ b/src/array.h | |||
@@ -13,6 +13,7 @@ namespace Bu | |||
13 | *@param value (typename) The type of data to store in your list | 13 | *@param value (typename) The type of data to store in your list |
14 | *@param valuealloc (typename) Memory Allocator for your value type | 14 | *@param valuealloc (typename) Memory Allocator for your value type |
15 | *@param linkalloc (typename) Memory Allocator for the list links. | 15 | *@param linkalloc (typename) Memory Allocator for the list links. |
16 | *@ingroup Containers | ||
16 | */ | 17 | */ |
17 | template<typename value, int inc=10, typename valuealloc=std::allocator<value> > | 18 | template<typename value, int inc=10, typename valuealloc=std::allocator<value> > |
18 | class Array | 19 | class Array |
@@ -9,6 +9,7 @@ namespace Bu | |||
9 | { | 9 | { |
10 | /** | 10 | /** |
11 | * | 11 | * |
12 | *@ingroup Containers | ||
12 | */ | 13 | */ |
13 | template <typename t, typename talloc=std::allocator<t> > | 14 | template <typename t, typename talloc=std::allocator<t> > |
14 | class Atom | 15 | class Atom |
diff --git a/src/client.h b/src/client.h index 2b7448c..4188a49 100644 --- a/src/client.h +++ b/src/client.h | |||
@@ -11,7 +11,8 @@ namespace Bu | |||
11 | class Socket; | 11 | class Socket; |
12 | 12 | ||
13 | /** | 13 | /** |
14 | * | 14 | *@author Mike Buland |
15 | *@ingroup Serving | ||
15 | */ | 16 | */ |
16 | class Client | 17 | class Client |
17 | { | 18 | { |
diff --git a/src/doxy/archives.dox b/src/doxy/archives.dox new file mode 100644 index 0000000..3b96aa3 --- /dev/null +++ b/src/doxy/archives.dox | |||
@@ -0,0 +1,9 @@ | |||
1 | /** | ||
2 | *@page howto_archives Archiving Your Data a.k.a. Serialization | ||
3 | * | ||
4 | * Archives are a simple system for providing basic-level data-structure | ||
5 | * serialization in a fast and simple manner. They even provide a few more | ||
6 | * advanced capabilities for when you need them. | ||
7 | * | ||
8 | *@todo Finish this page. | ||
9 | */ | ||
diff --git a/src/doxy/groups.dox b/src/doxy/groups.dox new file mode 100644 index 0000000..7bff7a7 --- /dev/null +++ b/src/doxy/groups.dox | |||
@@ -0,0 +1,19 @@ | |||
1 | /** | ||
2 | *@defgroup Threading | ||
3 | * Threads are awesome. | ||
4 | */ | ||
5 | |||
6 | /** | ||
7 | *@defgroup Serving | ||
8 | * Serving data is pretty cool too. | ||
9 | */ | ||
10 | |||
11 | /** | ||
12 | *@defgroup Containers | ||
13 | * Containers for data. | ||
14 | */ | ||
15 | |||
16 | /** | ||
17 | *@defgroup Taf | ||
18 | * Taf is the best! | ||
19 | */ | ||
diff --git a/src/main.dox b/src/doxy/main.dox index 668d2e3..7268890 100644 --- a/src/main.dox +++ b/src/doxy/main.dox | |||
@@ -7,6 +7,13 @@ | |||
7 | * cover a wide range of topics from streams and sockets to data structures to | 7 | * cover a wide range of topics from streams and sockets to data structures to |
8 | * data serialization and xml handling to threading. | 8 | * data serialization and xml handling to threading. |
9 | * | 9 | * |
10 | * This documentation is expanding all the time, and should contain | ||
11 | * comprehensive guides and API reference, but doesn't yet. For now check out | ||
12 | * these sections: | ||
13 | * - @ref howto_streams | ||
14 | * - @ref howto_archives | ||
15 | * - @ref howto_threading | ||
16 | * - @ref howto_servers | ||
10 | */ | 17 | */ |
11 | 18 | ||
12 | /** | 19 | /** |
diff --git a/src/doxy/servers.dox b/src/doxy/servers.dox new file mode 100644 index 0000000..0ba4bb1 --- /dev/null +++ b/src/doxy/servers.dox | |||
@@ -0,0 +1,11 @@ | |||
1 | /** | ||
2 | *@page howto_servers Creating Internet Servers | ||
3 | * | ||
4 | * Libbu++ provides a comprehensive set of classes for creating any type of | ||
5 | * server that you would like. At the moment these are restricted to using | ||
6 | * the Bu::Socket subclass of Bu::Stream, and therefore the INET socket | ||
7 | * namespace. This isn't much of a restriction, but hopefully it will be | ||
8 | * lifted in the future. | ||
9 | * | ||
10 | *@todo Finish this page. | ||
11 | */ | ||
diff --git a/src/doxy/streams.dox b/src/doxy/streams.dox new file mode 100644 index 0000000..65f01d7 --- /dev/null +++ b/src/doxy/streams.dox | |||
@@ -0,0 +1,158 @@ | |||
1 | /** | ||
2 | *@page howto_streams Working With Streams | ||
3 | * | ||
4 | * Working with libbu++ streams is simple and very straight-forward, but there | ||
5 | * are a few things to understand when you pick them up for the first time. | ||
6 | * | ||
7 | *@section whatis What is a stream? | ||
8 | * A stream is a mechanism that allows data to be transported from one place to | ||
9 | * another without interruption and in order. Examples of this include data | ||
10 | * being written to a file or being read from a file, data being written to a | ||
11 | * network socket or read from a network socket, and so on. | ||
12 | * Every type of stream will support a different number of options, for example | ||
13 | * file streams are usually seekable, that is, you can select where in the file | ||
14 | * you are reading and writing, however network sockets are not seekable. All | ||
15 | * of these properties can be determined at runtime through the Stream class. | ||
16 | * | ||
17 | *@section filters Using filters with streams | ||
18 | * Libbu++ supports a special type of Stream that is known as a Filter. Filters | ||
19 | * are actually streams, except instead of reading or writing to or from a | ||
20 | * file they read or write to or from another stream. This provides a handy | ||
21 | * way of chaining any number of filters together along with end-point streams | ||
22 | * such as files. One example of this would be applying a BZip2 compression | ||
23 | * filter to a file stream to compress all data being written to it. | ||
24 | * Once a filter is applied the transformations that it applies to the data will | ||
25 | * happen automatically as you use the stream. | ||
26 | * | ||
27 | * One important thing to remember about streams is that they will commonly | ||
28 | * change the options that you have when it comes to interacting with the | ||
29 | * stream. This is not a bad thing, it is necesarry, but it is easy to tell | ||
30 | * when this is happening. To continue with the above example, you can seek in | ||
31 | * a File stream, but not in a BZip2 filtered File stream. This has to do with | ||
32 | * the way the compression algorithms work and restrict the operations that can | ||
33 | * be easily performed on the data. | ||
34 | * | ||
35 | * Not all changes that filters apply will be restrictive, filters such as the | ||
36 | * Buffer filter will add the ability to seek (to an extent) within the buffered | ||
37 | * data. | ||
38 | * | ||
39 | *@section difference How are libbu++ streams different form stl streams? | ||
40 | * While not globally true, many stl streams are designed for formatting the | ||
41 | * data that flows through the stream, that means that when you attempt to | ||
42 | * write a uint32_t into a standard stream it can be difficult to predict what | ||
43 | * the result will be, will it be the binary representation or a textual | ||
44 | * conversion? | ||
45 | * | ||
46 | * Libbu++ streams are very direct about how the data is handled. All end-point | ||
47 | * streams will always handle the data that you provide or request without any | ||
48 | * modification or formatting, very much like the way libc style file access | ||
49 | * works. | ||
50 | * | ||
51 | * The design of Libbu++ streams was, from the begining, to try to make it as | ||
52 | * easy as possible to write general code that was as easy as possible to | ||
53 | * extend, and as clear as possible. We have accomplished this by making | ||
54 | * streams simple, yet flexible, with a clear API and a flexible filter system | ||
55 | * that something geared towards more general formatting, conversion, and | ||
56 | * operator-only access can't touch. | ||
57 | * | ||
58 | *@section usage Using streams directly | ||
59 | * To create a stream depends on the type of stream that you're interested in, | ||
60 | * each type has it's own constructors designed to create the stream and get | ||
61 | * it ready for use. We'll use the Bu::File stream as an example here. | ||
62 | * | ||
63 | *@code | ||
64 | // The constructor and each function call to access the stream could throw | ||
65 | // an exception, it's important to catch these and handle them | ||
66 | // appropriately. | ||
67 | try | ||
68 | { | ||
69 | // sFileName is a Bu::FString object containing the name of the file to | ||
70 | // open, possibly with path elements. The second parameter works like | ||
71 | // the fopen mode parameter, and can be "w" for write, "r" for read, or | ||
72 | // "a" for append. This will likely be replaced with a bitfield later. | ||
73 | Bu::File f( sFileName, "w"); | ||
74 | |||
75 | // At this point we know our file is open, lets write some data to it | ||
76 | // The first parameter is a pointer to the data to write, the second is | ||
77 | // how many bytes to write. | ||
78 | f.write( "Test data, boring old test data.\n", 33 ); | ||
79 | |||
80 | // We don't actually need to close the file explicitly, the | ||
81 | // deconstructor will take care of that for us, we could if we wanted | ||
82 | // to, simply by calling the f.close() function, but it isn't necesarry. | ||
83 | } | ||
84 | catch( Bu::FileException &e ) | ||
85 | { | ||
86 | // Here we can report the error to the system, whatever it happened to | ||
87 | // be. | ||
88 | printf("Error: %s\n", e.what() ); | ||
89 | } | ||
90 | @endcode | ||
91 | * This is a most basic example, but it covers all the basics. You don't need | ||
92 | * much more than this to write just about any file i/o program, just use the | ||
93 | * Bu::Stream::read() and Bu::Stream::write() functions. | ||
94 | * | ||
95 | * Now lets look at how to add a stream to the mix, we'll BZip2 compress the | ||
96 | * above example. | ||
97 | *@code | ||
98 | // Again, we want to catch exceptions in the entire file handling block. | ||
99 | try | ||
100 | { | ||
101 | // We create the file just like before, nothing different about this. | ||
102 | Bu::File f( sFileName, "w"); | ||
103 | |||
104 | // Here, however, we create our Bu::BZip2 object, and pass it a | ||
105 | // reference to the file. Now our data will go through Bu::BZip2, then | ||
106 | // into Bu::File and onto disk. Notice that you don't have to specify | ||
107 | // wether you want to read or write explicitly, the filter can usually | ||
108 | // determine this for itself by examining the underlying stream. | ||
109 | Bu::BZip2 bz2( f ); | ||
110 | |||
111 | // This is done exactly as before, but this time we write into bz2, not | ||
112 | // f. We already know how to do this, because both BZip2 and File | ||
113 | // inherit from Bu::Stream, so they both have very similar (if not | ||
114 | // identicle) API. | ||
115 | bz2.write( "Test data, boring old test data.\n", 33 ); | ||
116 | |||
117 | // Just like last time, we don't have to close either stream explicitly, | ||
118 | // they will be destroyed appropriately by the system, and in the | ||
119 | // correct order (bz2 first, then f). | ||
120 | } | ||
121 | catch( Bu::FileException &e ) | ||
122 | { | ||
123 | // Here we can report the error to the system, whatever it happened to | ||
124 | // be. | ||
125 | printf("Error: %s\n", e.what() ); | ||
126 | } | ||
127 | @endcode | ||
128 | * | ||
129 | * As you can tell in this example, using streams and filters is very easy to | ||
130 | * do, and even makes formerly very complex procedures take almost no time at | ||
131 | * all. | ||
132 | * | ||
133 | *@section usingmore Accepting strings in other classes and functions | ||
134 | * | ||
135 | * When writing a class or function that uses an already opened stream to read | ||
136 | * or write data from or to it's important to plan ahead, and probably accept | ||
137 | * an object reference of type Bu::Stream. This makes your code immediately | ||
138 | * much more portable, useful, and flexible. You don't have to change anything | ||
139 | * about the way you write your class or function, use the standard Bu::Stream | ||
140 | * functions like read and write just like before. | ||
141 | * | ||
142 | * For example, lets say you're creating a new image format, and need to be able | ||
143 | * to store images on disk and read them off again, so you write the approprate | ||
144 | * file fromat handlers. By using Bu::Stream instead of Bu::File you allow | ||
145 | * anyone using your image format to send that data anywhere they would like, | ||
146 | * including files, sockets, memory buffers, composite archives, and even | ||
147 | * through types of streams that don't exist yet. Not only that, but since | ||
148 | * every filter is a stream, anyone is now free to pass you a BZip2 filter or | ||
149 | * an encryption filter, or any other chain, so that your data can be | ||
150 | * compressed, and possibly encrypted, and sent over the network without any | ||
151 | * changes to your original code. | ||
152 | * | ||
153 | * Understandably you probably want to be sure of a few basics before you go | ||
154 | * writing image data to any old stream, such as ensuring the stream supports | ||
155 | * writing to begin with. This can be easily handled by taking advantage of | ||
156 | * the capability accessors in Bu::Stream, these begin with "can" and "is," see | ||
157 | * the documentation for more information. | ||
158 | */ | ||
diff --git a/src/doxy/threading.dox b/src/doxy/threading.dox new file mode 100644 index 0000000..0ae5325 --- /dev/null +++ b/src/doxy/threading.dox | |||
@@ -0,0 +1,15 @@ | |||
1 | /** | ||
2 | *@page howto_threading Making Applications Multi-threaded | ||
3 | * | ||
4 | * Libbu++ provides support for object oriented threading including full support | ||
5 | * for inter-thread communication and safety devices such as mutexes, | ||
6 | * conditions, and semaphores. It even provides some of the basic foundation | ||
7 | * classes in thread-safe versions that often add extra functionality and make | ||
8 | * writing thread-safe programs as easy as could be. | ||
9 | * | ||
10 | * Threads in libbu++ are currently based on the posix model, but will hopefully | ||
11 | * adopt other methods behind the scenes for compatability with other operating | ||
12 | * systems. | ||
13 | * | ||
14 | *@todo Finish this page. | ||
15 | */ | ||
@@ -165,6 +165,7 @@ namespace Bu | |||
165 | *@param keyalloc (typename) Memory allocator for hashtable keys | 165 | *@param keyalloc (typename) Memory allocator for hashtable keys |
166 | *@param valuealloc (typename) Memory allocator for hashtable values | 166 | *@param valuealloc (typename) Memory allocator for hashtable values |
167 | *@param challoc (typename) Byte allocator for bitflags | 167 | *@param challoc (typename) Byte allocator for bitflags |
168 | *@ingroup Containers | ||
168 | */ | 169 | */ |
169 | template<typename key, typename value, typename sizecalc, typename keyalloc, typename valuealloc, typename challoc > | 170 | template<typename key, typename value, typename sizecalc, typename keyalloc, typename valuealloc, typename challoc > |
170 | class Hash | 171 | class Hash |
@@ -6,11 +6,12 @@ | |||
6 | namespace Bu | 6 | namespace Bu |
7 | { | 7 | { |
8 | /** | 8 | /** |
9 | * Simple thread class. This wraps the basic pthread (posix threads) system in | 9 | * Simple thread class. This wraps the basic pthread (posix threads) |
10 | * an object oriented sort of way. It allows you to create a class with | 10 | * system in an object oriented sort of way. It allows you to create a |
11 | * standard member variables and callable functions that can be run in it's own | 11 | * class with standard member variables and callable functions that can be |
12 | * thread, one per class instance. | 12 | * run in it's own thread, one per class instance. |
13 | *@author Mike Buland | 13 | *@author Mike Buland |
14 | *@ingroup Threading | ||
14 | */ | 15 | */ |
15 | class Ito | 16 | class Ito |
16 | { | 17 | { |
@@ -27,24 +28,26 @@ namespace Bu | |||
27 | 28 | ||
28 | /** | 29 | /** |
29 | * Begin thread execution. This will call the overridden run function, | 30 | * Begin thread execution. This will call the overridden run function, |
30 | * which will simply execute in it's own thread until the function exits, | 31 | * which will simply execute in it's own thread until the function |
31 | * the thread is killed, or the thread is cancelled (optionally). The | 32 | * exits, the thread is killed, or the thread is cancelled (optionally). |
32 | * thread started in this manner has access to all of it's class variables, | 33 | * The thread started in this manner has access to all of it's class |
33 | * but be sure to protect possible multiple-access with ItoMutex objects. | 34 | * variables, but be sure to protect possible multiple-access with |
34 | *@returns True if starting the thread was successful. False if something | 35 | * ItoMutex objects. |
35 | * went wrong and the thread has not started. | 36 | * @returns True if starting the thread was successful. False if |
37 | * something went wrong and the thread has not started. | ||
36 | */ | 38 | */ |
37 | bool start(); | 39 | bool start(); |
38 | 40 | ||
39 | /** | 41 | /** |
40 | * Forcibly kill a thread. This is not generally considered a good thing to | 42 | * Forcibly kill a thread. This is not generally considered a good |
41 | * do, but in those rare cases you need it, it's invaluable. The problem | 43 | * thing to do, but in those rare cases you need it, it's invaluable. |
42 | * with stopping (or killing) a thread is that it stops it the moment you | 44 | * The problem with stopping (or killing) a thread is that it stops it |
43 | * call stop, no matter what it's doing. The object oriented approach to | 45 | * the moment you call stop, no matter what it's doing. The object |
44 | * this will help clean up any class variables that were used, but anything | 46 | * oriented approach to this will help clean up any class variables |
45 | * not managed as a member variable will probably create a memory leak type | 47 | * that were used, but anything not managed as a member variable will |
46 | * of situation. Instead of stop, consider using cancel, which can be | 48 | * probably create a memory leak type of situation. Instead of stop, |
47 | * handled by the running thread in a graceful manner. | 49 | * consider using cancel, which can be handled by the running thread in |
50 | * a graceful manner. | ||
48 | *@returns True if the thread was stopped, false otherwise. When this | 51 | *@returns True if the thread was stopped, false otherwise. When this |
49 | * function returns the thread may not have stopped, to ensure that the | 52 | * function returns the thread may not have stopped, to ensure that the |
50 | * thread has really stopped, call join. | 53 | * thread has really stopped, call join. |
@@ -52,11 +55,11 @@ namespace Bu | |||
52 | bool stop(); | 55 | bool stop(); |
53 | 56 | ||
54 | /** | 57 | /** |
55 | * The workhorse of the Ito class. This is the function that will run in | 58 | * The workhorse of the Ito class. This is the function that will run |
56 | * the thread, when this function exits the thread dies and is cleaned up | 59 | * in the thread, when this function exits the thread dies and is |
57 | * by the system. Make sure to read up on ItoMutex, ItoCondition, and | 60 | * cleaned up by the system. Make sure to read up on ItoMutex, |
58 | * cancel to see how to control and protect everything you do in a safe way | 61 | * ItoCondition, and cancel to see how to control and protect |
59 | * within this function. | 62 | * everything you do in a safe way within this function. |
60 | *@returns I'm not sure right now, but this is the posix standard form. | 63 | *@returns I'm not sure right now, but this is the posix standard form. |
61 | */ | 64 | */ |
62 | virtual void *run()=0; | 65 | virtual void *run()=0; |
@@ -64,13 +67,13 @@ namespace Bu | |||
64 | /** | 67 | /** |
65 | * Join the thread in action. This function performs what is commonly | 68 | * Join the thread in action. This function performs what is commonly |
66 | * called a thread join. That is that it effectively makes the calling | 69 | * called a thread join. That is that it effectively makes the calling |
67 | * thread an the Ito thread contained in the called object one in the same, | 70 | * thread an the Ito thread contained in the called object one in the |
68 | * and pauses the calling thread until the called thread exits. That is, | 71 | * same, and pauses the calling thread until the called thread exits. |
69 | * when called from, say, your main(), mythread.join() will not return until | 72 | * That is, when called from, say, your main(), mythread.join() will |
70 | * the thread mythread has exited. This is very handy at the end of | 73 | * not return until the thread mythread has exited. This is very handy |
71 | * programs to ensure all of your data was cleaned up. | 74 | * at the end of programs to ensure all of your data was cleaned up. |
72 | *@returns True if the thread was joined, false if the thread couldn't be | 75 | *@returns True if the thread was joined, false if the thread couldn't |
73 | * joined, usually because it isn't running to begin with. | 76 | * be joined, usually because it isn't running to begin with. |
74 | */ | 77 | */ |
75 | bool join(); | 78 | bool join(); |
76 | 79 | ||
diff --git a/src/itoatom.h b/src/itoatom.h index 7fc9090..2f8ac41 100644 --- a/src/itoatom.h +++ b/src/itoatom.h | |||
@@ -9,6 +9,7 @@ | |||
9 | /** | 9 | /** |
10 | * A thread-safe wrapper class. | 10 | * A thread-safe wrapper class. |
11 | *@author Mike Buland | 11 | *@author Mike Buland |
12 | *@ingroup Threading | ||
12 | */ | 13 | */ |
13 | template <class T> | 14 | template <class T> |
14 | class ItoAtom | 15 | class ItoAtom |
diff --git a/src/itocondition.h b/src/itocondition.h index 1793f81..517dd5f 100644 --- a/src/itocondition.h +++ b/src/itocondition.h | |||
@@ -10,9 +10,9 @@ namespace Bu | |||
10 | /** | 10 | /** |
11 | * Ito condition. This is a fairly simple condition mechanism. As you may | 11 | * Ito condition. This is a fairly simple condition mechanism. As you may |
12 | * notice this class inherits from the ItoMutex class, this is because all | 12 | * notice this class inherits from the ItoMutex class, this is because all |
13 | * conditions must be within a locked block. The standard usage of a condition | 13 | * conditions must be within a locked block. The standard usage of a |
14 | * is to pause one thread, perhaps indefinately, until another thread signals | 14 | * condition is to pause one thread, perhaps indefinately, until another |
15 | * that it is alright to procede. | 15 | * thread signals that it is alright to procede. |
16 | * <br> | 16 | * <br> |
17 | * Standard usage for the thread that wants to wait is as follows: | 17 | * Standard usage for the thread that wants to wait is as follows: |
18 | * <pre> | 18 | * <pre> |
@@ -24,10 +24,11 @@ namespace Bu | |||
24 | * ... // Take care of what you have to. | 24 | * ... // Take care of what you have to. |
25 | * cond.unlock(); | 25 | * cond.unlock(); |
26 | * </pre> | 26 | * </pre> |
27 | * The usage for the triggering thread is much simpler, when it needs to tell | 27 | * The usage for the triggering thread is much simpler, when it needs to |
28 | * the others that it's time to grab some data it calls either signal or | 28 | * tell the others that it's time to grab some data it calls either signal |
29 | * broadcast. See both of those functions for the difference. | 29 | * or broadcast. See both of those functions for the difference. |
30 | *@author Mike Buland | 30 | *@author Mike Buland |
31 | *@ingroup Threading | ||
31 | */ | 32 | */ |
32 | class ItoCondition : public ItoMutex | 33 | class ItoCondition : public ItoMutex |
33 | { | 34 | { |
@@ -43,9 +44,9 @@ namespace Bu | |||
43 | ~ItoCondition(); | 44 | ~ItoCondition(); |
44 | 45 | ||
45 | /** | 46 | /** |
46 | * Wait forever, or until signalled. This has to be called from within a | 47 | * Wait forever, or until signalled. This has to be called from within |
47 | * locked section, i.e. before calling this this object's lock function | 48 | * a locked section, i.e. before calling this this object's lock |
48 | * should be called. | 49 | * function should be called. |
49 | */ | 50 | */ |
50 | int wait(); | 51 | int wait(); |
51 | 52 | ||
@@ -60,16 +61,18 @@ namespace Bu | |||
60 | int wait( int nSec, int nUSec ); | 61 | int wait( int nSec, int nUSec ); |
61 | 62 | ||
62 | /** | 63 | /** |
63 | * Notify the next thread waiting on this condition that they can go ahead. | 64 | * Notify the next thread waiting on this condition that they can go |
64 | * This only signals one thread, the next one in the condition queue, that | 65 | * ahead. This only signals one thread, the next one in the condition |
65 | * it is safe to procede with whatever operation was being waited on. | 66 | * queue, that it is safe to procede with whatever operation was being |
67 | * waited on. | ||
66 | */ | 68 | */ |
67 | int signal(); | 69 | int signal(); |
68 | 70 | ||
69 | /** | 71 | /** |
70 | * Notify all threads waiting on this condition that they can go ahead now. | 72 | * Notify all threads waiting on this condition that they can go ahead |
71 | * This function is slower than signal, but more effective in certain | 73 | * now. This function is slower than signal, but more effective in |
72 | * situations where you may not know how many threads should be activated. | 74 | * certain situations where you may not know how many threads should be |
75 | * activated. | ||
73 | */ | 76 | */ |
74 | int broadcast(); | 77 | int broadcast(); |
75 | 78 | ||
diff --git a/src/itomutex.h b/src/itomutex.h index 9c9d205..27ca125 100644 --- a/src/itomutex.h +++ b/src/itomutex.h | |||
@@ -7,10 +7,11 @@ namespace Bu | |||
7 | { | 7 | { |
8 | /** | 8 | /** |
9 | * Simple mutex wrapper. Currently this doesn't do anything extra for you | 9 | * Simple mutex wrapper. Currently this doesn't do anything extra for you |
10 | * except keep all of the functionality together in an OO sorta' way and keep | 10 | * except keep all of the functionality together in an OO sorta' way and |
11 | * you from having to worry about cleaning up your mutexes properly, or initing | 11 | * keep you from having to worry about cleaning up your mutexes properly, |
12 | * them. | 12 | * or initing them. |
13 | *@author Mike Buland | 13 | *@author Mike Buland |
14 | *@ingroup Threading | ||
14 | */ | 15 | */ |
15 | class ItoMutex | 16 | class ItoMutex |
16 | { | 17 | { |
@@ -23,33 +24,33 @@ namespace Bu | |||
23 | /** | 24 | /** |
24 | * Destroy a mutex. This can only be done when a mutex is unlocked. | 25 | * Destroy a mutex. This can only be done when a mutex is unlocked. |
25 | * Failure to unlock before destroying a mutex object could cause it to | 26 | * Failure to unlock before destroying a mutex object could cause it to |
26 | * wait for the mutex to unlock, the odds of which are usually farily low | 27 | * wait for the mutex to unlock, the odds of which are usually farily |
27 | * at deconstruction time. | 28 | * low at deconstruction time. |
28 | */ | 29 | */ |
29 | ~ItoMutex(); | 30 | ~ItoMutex(); |
30 | 31 | ||
31 | /** | 32 | /** |
32 | * Lock the mutex. This causes all future calls to lock on this instance | 33 | * Lock the mutex. This causes all future calls to lock on this |
33 | * of mutex to block until the first thread that called mutex unlocks it. | 34 | * instance of mutex to block until the first thread that called mutex |
34 | * At that point the next thread that called lock will get a chance to go | 35 | * unlocks it. At that point the next thread that called lock will get |
35 | * to work. Because of the nature of a mutex lock it is a very bad idea to | 36 | * a chance to go to work. Because of the nature of a mutex lock it is |
36 | * do any kind of serious or rather time consuming computation within a | 37 | * a very bad idea to do any kind of serious or rather time consuming |
37 | * locked section. This can cause thread-deadlock and your program may | 38 | * computation within a locked section. This can cause thread-deadlock |
38 | * hang. | 39 | * and your program may hang. |
39 | */ | 40 | */ |
40 | int lock(); | 41 | int lock(); |
41 | 42 | ||
42 | /** | 43 | /** |
43 | * Unlock the mutex. This allows the next thread that asked for a lock to | 44 | * Unlock the mutex. This allows the next thread that asked for a lock |
44 | * lock the mutex and continue with execution. | 45 | * to lock the mutex and continue with execution. |
45 | */ | 46 | */ |
46 | int unlock(); | 47 | int unlock(); |
47 | 48 | ||
48 | /** | 49 | /** |
49 | * Try to lock the mutex. This is the option to go with if you cannot avoid | 50 | * Try to lock the mutex. This is the option to go with if you cannot |
50 | * putting lengthy operations within a locked section. trylock will attempt | 51 | * avoid putting lengthy operations within a locked section. trylock |
51 | * to lock the mutex, if the mutex is already locked this function returns | 52 | * will attempt to lock the mutex, if the mutex is already locked this |
52 | * immediately with an error code. | 53 | * function returns immediately with an error code. |
53 | */ | 54 | */ |
54 | int trylock(); | 55 | int trylock(); |
55 | 56 | ||
diff --git a/src/itoqueue.h b/src/itoqueue.h index 5945344..1a4e0b6 100644 --- a/src/itoqueue.h +++ b/src/itoqueue.h | |||
@@ -16,6 +16,7 @@ namespace Bu | |||
16 | * something is enqueued within the specified time limit, or NULL if the | 16 | * something is enqueued within the specified time limit, or NULL if the |
17 | * time limit is exceded. | 17 | * time limit is exceded. |
18 | *@author Mike Buland | 18 | *@author Mike Buland |
19 | *@ingroup Threading Containers | ||
19 | */ | 20 | */ |
20 | template <class T> | 21 | template <class T> |
21 | class ItoQueue | 22 | class ItoQueue |
@@ -59,11 +60,11 @@ namespace Bu | |||
59 | } | 60 | } |
60 | 61 | ||
61 | /** | 62 | /** |
62 | * Enqueue a pieces of data. The new data will go at the end of the queue, | 63 | * Enqueue a pieces of data. The new data will go at the end of the |
63 | * and unless another piece of data is enqueued, will be the last piece of | 64 | * queue, and unless another piece of data is enqueued, will be the |
64 | * data to be dequeued. | 65 | * last piece of data to be dequeued. |
65 | *@param pData The data to enqueue. If this is not a primitive data type | 66 | *@param pData The data to enqueue. If this is not a primitive data |
66 | * it's probably best to use a pointer type. | 67 | * type it's probably best to use a pointer type. |
67 | */ | 68 | */ |
68 | void enqueue( T pData ) | 69 | void enqueue( T pData ) |
69 | { | 70 | { |
@@ -91,20 +92,22 @@ namespace Bu | |||
91 | } | 92 | } |
92 | 93 | ||
93 | /** | 94 | /** |
94 | * Dequeue the first item from the queue. This function can operate in two | 95 | * Dequeue the first item from the queue. This function can operate in |
95 | * different modes, blocking and non-blocking. In non-blocking mode it will | 96 | * two different modes, blocking and non-blocking. In non-blocking |
96 | * return immediately weather there was data in the queue or not. If there | 97 | * mode it will return immediately weather there was data in the queue |
97 | * was data it will remove it from the queue and return it to the caller. | 98 | * or not. If there was data it will remove it from the queue and |
98 | * In blocking mode it will block forever wating for data to be enqueued. | 99 | * return it to the caller. |
99 | * When data finally is enqueued this function will return immediately with | 100 | * |
100 | * the new data. The only way this function should ever return a null in | 101 | * In blocking mode it will block forever wating for data to be |
101 | * blocking mode is if the calling thread was cancelled. It's probably a | 102 | * enqueued. When data finally is enqueued this function will return |
102 | * good idea to check for NULL return values even if you use blocking, just | 103 | * immediately with the new data. The only way this function should |
103 | * to be on the safe side. | 104 | * ever return a null in blocking mode is if the calling thread was |
104 | *@param bBlock Set to true to enable blocking, leave as false to work in | 105 | * cancelled. It's probably a good idea to check for NULL return |
105 | * non-blocking mode. | 106 | * values even if you use blocking, just to be on the safe side. |
106 | *@returns The next piece of data in the queue, or NULL if no data was in | 107 | *@param bBlock Set to true to enable blocking, leave as false to work |
107 | * the queue. | 108 | * in non-blocking mode. |
109 | *@returns The next piece of data in the queue, or NULL if no data was | ||
110 | * in the queue. | ||
108 | */ | 111 | */ |
109 | T dequeue( bool bBlock=false ) | 112 | T dequeue( bool bBlock=false ) |
110 | { | 113 | { |
@@ -143,15 +146,15 @@ namespace Bu | |||
143 | } | 146 | } |
144 | 147 | ||
145 | /** | 148 | /** |
146 | * Operates just like the other dequeue function in blocking mode with one | 149 | * Operates just like the other dequeue function in blocking mode with |
147 | * twist. This function will block for at most nSec seconds and nUSec | 150 | * one twist. This function will block for at most nSec seconds and |
148 | * micro-seconds. If the timer is up and no data is available, this will | 151 | * nUSec micro-seconds. If the timer is up and no data is available, |
149 | * just return NULL. If data is enqueued before the timeout expires, it | 152 | * this will just return NULL. If data is enqueued before the timeout |
150 | * will dequeue and exit immediately. | 153 | * expires, it will dequeue and exit immediately. |
151 | *@param nSec The number of seconds to wait, max. | 154 | *@param nSec The number of seconds to wait, max. |
152 | *@param nUSec The number of micro-seconds to wait, max. | 155 | *@param nUSec The number of micro-seconds to wait, max. |
153 | *@returns The next piece of data in the queue, or NULL if the timeout was | 156 | *@returns The next piece of data in the queue, or NULL if the timeout |
154 | * exceeded. | 157 | * was exceeded. |
155 | */ | 158 | */ |
156 | T dequeue( int nSec, int nUSec ) | 159 | T dequeue( int nSec, int nUSec ) |
157 | { | 160 | { |
@@ -195,9 +198,9 @@ namespace Bu | |||
195 | } | 198 | } |
196 | 199 | ||
197 | /** | 200 | /** |
198 | * Checks to see if the queue has data in it or not. Note that there is no | 201 | * Checks to see if the queue has data in it or not. Note that there |
199 | * function to determine the length of the queue. This data isn't kept | 202 | * is no function to determine the length of the queue. This data |
200 | * track of. If you really need to know, fix this. | 203 | * isn't kept track of. If you really need to know, fix this. |
201 | *@returns True if the queue is empty, false if it has data in it. | 204 | *@returns True if the queue is empty, false if it has data in it. |
202 | */ | 205 | */ |
203 | bool isEmpty() | 206 | bool isEmpty() |
diff --git a/src/itoserver.h b/src/itoserver.h index 60b15b4..729ae7a 100644 --- a/src/itoserver.h +++ b/src/itoserver.h | |||
@@ -34,6 +34,8 @@ namespace Bu | |||
34 | * In order to use a Server you must subclass it and implement the pure | 34 | * In order to use a Server you must subclass it and implement the pure |
35 | * virtual functions. These allow you to receive notification of events | 35 | * virtual functions. These allow you to receive notification of events |
36 | * happening within the server itself, and actually makes it useful. | 36 | * happening within the server itself, and actually makes it useful. |
37 | *@author Mike Buland | ||
38 | *@ingroup Threading Serving | ||
37 | */ | 39 | */ |
38 | class ItoServer : public Ito | 40 | class ItoServer : public Ito |
39 | { | 41 | { |
@@ -25,6 +25,7 @@ namespace Bu | |||
25 | *@param value (typename) The type of data to store in your list | 25 | *@param value (typename) The type of data to store in your list |
26 | *@param valuealloc (typename) Memory Allocator for your value type | 26 | *@param valuealloc (typename) Memory Allocator for your value type |
27 | *@param linkalloc (typename) Memory Allocator for the list links. | 27 | *@param linkalloc (typename) Memory Allocator for the list links. |
28 | *@ingroup Containers | ||
28 | */ | 29 | */ |
29 | template<typename value, typename valuealloc=std::allocator<value>, typename linkalloc=std::allocator<struct ListLink<value> > > | 30 | template<typename value, typename valuealloc=std::allocator<value>, typename linkalloc=std::allocator<struct ListLink<value> > > |
30 | class List | 31 | class List |
diff --git a/src/protocol.h b/src/protocol.h index bca337f..7b69553 100644 --- a/src/protocol.h +++ b/src/protocol.h | |||
@@ -8,7 +8,8 @@ namespace Bu | |||
8 | class Client; | 8 | class Client; |
9 | 9 | ||
10 | /** | 10 | /** |
11 | * | 11 | *@author Mike Buland |
12 | *@ingroup Serving | ||
12 | */ | 13 | */ |
13 | class Protocol | 14 | class Protocol |
14 | { | 15 | { |
diff --git a/src/ringbuffer.h b/src/ringbuffer.h index be80e2f..6a4eecf 100644 --- a/src/ringbuffer.h +++ b/src/ringbuffer.h | |||
@@ -6,6 +6,9 @@ | |||
6 | 6 | ||
7 | namespace Bu | 7 | namespace Bu |
8 | { | 8 | { |
9 | /** | ||
10 | *@ingroup Containers | ||
11 | */ | ||
9 | template<typename value, typename valuealloc=std::allocator<value> > | 12 | template<typename value, typename valuealloc=std::allocator<value> > |
10 | class RingBuffer | 13 | class RingBuffer |
11 | { | 14 | { |
diff --git a/src/server.h b/src/server.h index 302b6e3..499bf26 100644 --- a/src/server.h +++ b/src/server.h | |||
@@ -30,6 +30,8 @@ namespace Bu | |||
30 | * In order to use a Server you must subclass it and implement the pure | 30 | * In order to use a Server you must subclass it and implement the pure |
31 | * virtual functions. These allow you to receive notification of events | 31 | * virtual functions. These allow you to receive notification of events |
32 | * happening within the server itself, and actually makes it useful. | 32 | * happening within the server itself, and actually makes it useful. |
33 | *@author Mike Buland | ||
34 | *@ingroup Serving | ||
33 | */ | 35 | */ |
34 | class Server | 36 | class Server |
35 | { | 37 | { |
diff --git a/src/serversocket.h b/src/serversocket.h index b4ee247..751768d 100644 --- a/src/serversocket.h +++ b/src/serversocket.h | |||
@@ -15,6 +15,9 @@ namespace Bu | |||
15 | * | 15 | * |
16 | * Although the accept function returns an integral file descriptor, it is | 16 | * Although the accept function returns an integral file descriptor, it is |
17 | * designed to be used with the Socket class. | 17 | * designed to be used with the Socket class. |
18 | * | ||
19 | *@author Mike Buland | ||
20 | *@ingroup Serving | ||
18 | */ | 21 | */ |
19 | class ServerSocket | 22 | class ServerSocket |
20 | { | 23 | { |
@@ -33,6 +33,7 @@ namespace Bu | |||
33 | *@param sizecalc (typename) Functor to compute new table size on rehash | 33 | *@param sizecalc (typename) Functor to compute new table size on rehash |
34 | *@param keyalloc (typename) Memory allocator for hashtable keys | 34 | *@param keyalloc (typename) Memory allocator for hashtable keys |
35 | *@param challoc (typename) Byte allocator for bitflags | 35 | *@param challoc (typename) Byte allocator for bitflags |
36 | *@ingroup Containers | ||
36 | */ | 37 | */ |
37 | template<typename key, typename sizecalc, typename keyalloc, typename challoc > | 38 | template<typename key, typename sizecalc, typename keyalloc, typename challoc > |
38 | class Set | 39 | class Set |
diff --git a/src/socket.h b/src/socket.h index d0949cc..95271f8 100644 --- a/src/socket.h +++ b/src/socket.h | |||
@@ -9,7 +9,8 @@ | |||
9 | namespace Bu | 9 | namespace Bu |
10 | { | 10 | { |
11 | /** | 11 | /** |
12 | * | 12 | *@author Mike Buland |
13 | *@ingroup Serving Streams | ||
13 | */ | 14 | */ |
14 | class Socket : public Stream | 15 | class Socket : public Stream |
15 | { | 16 | { |
@@ -9,6 +9,9 @@ namespace Bu | |||
9 | template<typename T> class SPtr; | 9 | template<typename T> class SPtr; |
10 | template< typename Tb, typename Ta > SPtr<Tb> SPtrCast( SPtr<Ta> src ); | 10 | template< typename Tb, typename Ta > SPtr<Tb> SPtrCast( SPtr<Ta> src ); |
11 | 11 | ||
12 | /** | ||
13 | *@ingroup Containers | ||
14 | */ | ||
12 | template<typename T> | 15 | template<typename T> |
13 | class SPtr | 16 | class SPtr |
14 | { | 17 | { |
diff --git a/src/tafnode.h b/src/tafnode.h index 4940bee..585ba73 100644 --- a/src/tafnode.h +++ b/src/tafnode.h | |||
@@ -10,6 +10,7 @@ namespace Bu | |||
10 | { | 10 | { |
11 | /** | 11 | /** |
12 | * | 12 | * |
13 | *@ingroup Taf | ||
13 | */ | 14 | */ |
14 | class TafNode | 15 | class TafNode |
15 | { | 16 | { |
@@ -33,6 +34,10 @@ namespace Bu | |||
33 | 34 | ||
34 | class TafProperty; | 35 | class TafProperty; |
35 | class TafComment; | 36 | class TafComment; |
37 | /** | ||
38 | * | ||
39 | *@ingroup Taf | ||
40 | */ | ||
36 | class TafGroup : public TafNode | 41 | class TafGroup : public TafNode |
37 | { | 42 | { |
38 | public: | 43 | public: |
@@ -68,6 +73,10 @@ namespace Bu | |||
68 | NodeList lChildren; | 73 | NodeList lChildren; |
69 | }; | 74 | }; |
70 | 75 | ||
76 | /** | ||
77 | * | ||
78 | *@ingroup Taf | ||
79 | */ | ||
71 | class TafProperty : public TafNode | 80 | class TafProperty : public TafNode |
72 | { | 81 | { |
73 | public: | 82 | public: |
@@ -82,6 +91,10 @@ namespace Bu | |||
82 | Bu::FString sValue; | 91 | Bu::FString sValue; |
83 | }; | 92 | }; |
84 | 93 | ||
94 | /** | ||
95 | * | ||
96 | *@ingroup Taf | ||
97 | */ | ||
85 | class TafComment : public TafNode | 98 | class TafComment : public TafNode |
86 | { | 99 | { |
87 | public: | 100 | public: |
diff --git a/src/tafreader.h b/src/tafreader.h index eeaafb3..da285ab 100644 --- a/src/tafreader.h +++ b/src/tafreader.h | |||
@@ -10,6 +10,7 @@ namespace Bu | |||
10 | { | 10 | { |
11 | /** | 11 | /** |
12 | * | 12 | * |
13 | *@ingroup Taf | ||
13 | */ | 14 | */ |
14 | class TafReader | 15 | class TafReader |
15 | { | 16 | { |
diff --git a/src/tafwriter.h b/src/tafwriter.h index f34395e..3e578d8 100644 --- a/src/tafwriter.h +++ b/src/tafwriter.h | |||
@@ -10,6 +10,7 @@ namespace Bu | |||
10 | { | 10 | { |
11 | /** | 11 | /** |
12 | * | 12 | * |
13 | *@ingroup Taf | ||
13 | */ | 14 | */ |
14 | class TafWriter | 15 | class TafWriter |
15 | { | 16 | { |
diff --git a/src/tests/size.cpp b/src/tests/size.cpp new file mode 100644 index 0000000..be13b69 --- /dev/null +++ b/src/tests/size.cpp | |||
@@ -0,0 +1,13 @@ | |||
1 | #include "bu/hash.h" | ||
2 | #include "bu/fstring.h" | ||
3 | |||
4 | #define pSize( t ) printf("%15s: %db\n", #t, sizeof( t ) ); | ||
5 | |||
6 | int main() | ||
7 | { | ||
8 | typedef Bu::Hash<char, char> charcharHash; | ||
9 | typedef Bu::Hash<Bu::FString, Bu::FString> strstrHash; | ||
10 | pSize( Bu::FString ); | ||
11 | pSize( charcharHash ); | ||
12 | pSize( strstrHash ); | ||
13 | } | ||