Showing
1 changed file
with
57 additions
and
141 deletions
| 1 | -LIBTRBASE | ||
| 2 | -========= | 1 | +# Libtrbase |
| 3 | 2 | ||
| 4 | As the very basic building block of | 3 | As the very basic building block of |
| 5 | -[taskrambler](http://taskrambler.weird-web-workers.org/) this library | ||
| 6 | -provides a system to create basic classes and interfaces in | 4 | +[taskrambler](https://gitlab.weird-web-workers.org/taskrambler/taskrambler) |
| 5 | +this library provides a system to create basic classes and interfaces in | ||
| 7 | ANSI C, some common macro definitions (always useful) and an optimized | 6 | ANSI C, some common macro definitions (always useful) and an optimized |
| 8 | memory management system. | 7 | memory management system. |
| 9 | 8 | ||
| 10 | -### Links | ||
| 11 | - * See the latest coverage report [here](http://ci-build.weird-web-workers.org/trbase/coverage_latest/). | ||
| 12 | - * The generated API doc can be found [here](http://ci-build.weird-web-workers.org/trbase/api_latest/). | ||
| 13 | - * You can download a version [here](http://ci-build.weird-web-workers.org/trbase/artifacts/). | 9 | +## Synopsis |
| 14 | 10 | ||
| 15 | -### The class system ### | 11 | +All prototypes can be included with: |
| 12 | + | ||
| 13 | +```C | ||
| 14 | +#include <trbase.h> | ||
| 15 | + | ||
| 16 | +... | ||
| 17 | +``` | ||
| 18 | + | ||
| 19 | +Link your code against the library: ```gcc -ltrbase ...```. | ||
| 20 | + | ||
| 21 | +## Description | ||
| 22 | + | ||
| 23 | +### The class system | ||
| 16 | 24 | ||
| 17 | The class system is not what you know from "real" object oriented languages. | 25 | The class system is not what you know from "real" object oriented languages. |
| 18 | It only provides these few OOP features: | 26 | It only provides these few OOP features: |
| @@ -46,7 +54,7 @@ The ideas for this are partly derived from the Book | @@ -46,7 +54,7 @@ The ideas for this are partly derived from the Book | ||
| 46 | In the examples I will show how libtrbase supports you in creating these | 54 | In the examples I will show how libtrbase supports you in creating these |
| 47 | structures. | 55 | structures. |
| 48 | 56 | ||
| 49 | -### The optimized memory management ### | 57 | +### The optimized memory management |
| 50 | 58 | ||
| 51 | Allocating and freeing memory on the heap is an expensive action. And because | 59 | Allocating and freeing memory on the heap is an expensive action. And because |
| 52 | of fragmentation effects it might become even more expensive if the process | 60 | of fragmentation effects it might become even more expensive if the process |
| @@ -70,151 +78,59 @@ The Joseph M. Newcomer Co. | @@ -70,151 +78,59 @@ The Joseph M. Newcomer Co. | ||
| 70 | The concrete idea was first described by Charles B. Weinstock in his Ph.D. | 78 | The concrete idea was first described by Charles B. Weinstock in his Ph.D. |
| 71 | dissertation on storage allocation. | 79 | dissertation on storage allocation. |
| 72 | 80 | ||
| 73 | -INSTALLATION | ||
| 74 | ------------- | ||
| 75 | - | ||
| 76 | -This can be installed via the usual configure, make, make install | ||
| 77 | -cycle. For gentoo users am ebuild is added under docs. | ||
| 78 | - | ||
| 79 | -### API DOC ### | ||
| 80 | - | ||
| 81 | -To generate the api doc a patched version of doxygen is | ||
| 82 | -neccessary. A patch is included under docs. | ||
| 83 | - | ||
| 84 | -`make docs` creates the api doc. | ||
| 85 | - | ||
| 86 | -### TEST COVERAGE REPORT | ||
| 87 | - | ||
| 88 | -gcov and lcov are needed to build these. | ||
| 89 | - | ||
| 90 | -The source has to be configured with `configure --enable-gcov`. | ||
| 91 | -`make coverage-html` creates the converage reports then. | ||
| 92 | - | ||
| 93 | - | ||
| 94 | -USAGE | ||
| 95 | ------ | ||
| 96 | - | ||
| 97 | -### API ### | ||
| 98 | - | ||
| 99 | -The public API consists of several preprocessor macros and some functions. | ||
| 100 | -When you look through the code you will find other symbols (functions or | ||
| 101 | -macros) which might seem useful. Here I try to focus on the neccessaties | ||
| 102 | -for using the library. | ||
| 103 | - | ||
| 104 | -#### function-like macros - class creation #### | ||
| 105 | - | ||
| 106 | -* `TR_CLASS(name)`: Declare a new class. | ||
| 107 | -* `TR_CREATE_CLASS(name, parent, ...)`: Create a new class. | ||
| 108 | -* `TR_EXTENDS(parent)`: Extend another class | ||
| 109 | - | ||
| 110 | -#### function-like macros - class information #### | 81 | +### Installation |
| 111 | 82 | ||
| 112 | -* `TR_GET_CLASS(object)`: Get the class of the given object. | ||
| 113 | -* `TR_HAS_PARENT(class)`: Check if the class extends another class. | ||
| 114 | -* `TR_IS_OBJECT(obj)`: Check that the given pointer is really an | ||
| 115 | - instance of a class. | ||
| 116 | -* `TR_INSTANCE_OF(class, obj)`: Check that the given obj is an instance of | ||
| 117 | - class. | 83 | +This can be installed via the usual configure, make, make install cycle. For |
| 84 | +gentoo users am ebuild is added under docs. | ||
| 118 | 85 | ||
| 119 | -#### function-like macros - interface selector helper #### | 86 | +### Documentation |
| 120 | 87 | ||
| 121 | -* `TR_CALL(object, iface, method, ...)`: Call the interface implementation | ||
| 122 | - of the class or one of the parent classes of object. | ||
| 123 | -* `TR_RETCALL(object, iface, method, ret, ...)`: Same as TR\_CALL but | ||
| 124 | - with return value. | ||
| 125 | -* `TR_PARENTCALL(object, iface, method, ...)`: Directly call the | ||
| 126 | - implementation within the parent class. | 88 | +* The API doc can be found |
| 89 | + [here](http://ci-build.weird-web-workers.org/trbase/api_latest/). | ||
| 90 | +* See the latest coverage report | ||
| 91 | + [here](http://ci-build.weird-web-workers.org/trbase/coverage_latest/). | ||
| 92 | +* You may have a look in our WIKI | ||
| 93 | + [here](https://gitlab.weird-web-workers.org/taskrambler/trbase/wikis/home). | ||
| 127 | 94 | ||
| 128 | -#### function-like macros - interface creation #### | 95 | +## Requirements |
| 129 | 96 | ||
| 130 | -* `TR_INTERFACE(name)`: Declare a new inerface. | ||
| 131 | -* `TR_CREATE_INTERFACE(name, nfunc)`: Create the new interface. | ||
| 132 | -* `TR_INIT_IFACE(name, ...)`: Create an interface implementation and assign | ||
| 133 | - functions to it. | ||
| 134 | -* `TR_IF(name)`: Convenience for getting an interface implementation by name. | ||
| 135 | - Used when assigning an interface to a class. | 97 | +### Buildtime |
| 136 | 98 | ||
| 137 | -#### function-like macros for the class interface #### | ||
| 138 | -The valious constructor and destructors are also assigned to an interface. The | ||
| 139 | -is the only interface every class MUST have so that instances can be created and | ||
| 140 | -destroyed. At least a constructor and a destructor must be assigned to this | ||
| 141 | -interface. The following selectors then utilize the interface to create and | ||
| 142 | -destroy instances. | 99 | +#### required |
| 143 | 100 | ||
| 144 | -* `TR_new(class, ...)`: Create a new instance of a class with a variable | ||
| 145 | - argument list for the constructor interface. | ||
| 146 | -* `TR_newv(class, args)`: Same as *TR_new* but accepts a va_list* for the | ||
| 147 | - constructor arguments. | ||
| 148 | -* `TR_delete(object)`: Destroy an instance. | ||
| 149 | -* `TR_clone(object)`: Call an constructor that accepts another instance to | ||
| 150 | - create a clone from this instance. | 101 | + * A C compiler & Tools. |
| 151 | 102 | ||
| 152 | -#### selector functions subject/observer interface #### | ||
| 153 | -These are in fact two interfaces that can be used to implement the | ||
| 154 | -subject/observer design pattern. | 103 | +#### optional |
| 155 | 104 | ||
| 156 | -* `TR_subjectAttach(Subject, Observer)`: Add an observer to a subject. The | ||
| 157 | - concrete implementation has to take care of memory management etc. | ||
| 158 | -* `TR_subjectDetach(Subject, Observer)`: Remove an observer from a subject. | ||
| 159 | -* `TR_notify(Subject):* Notify all registered observer of an event. | ||
| 160 | -* `TR_observerUpdate(Observer, Subject)`: This must be called in | ||
| 161 | - TR_subjectNotify to inform a registered observer of an event. | 105 | + * `lcov`: To generate test coverage reports. |
| 106 | + * `doxygen`: For API doc creation. | ||
| 107 | + * `valgrind`: For memory checks. | ||
| 162 | 108 | ||
| 163 | -#### selector functions indexable interface #### | 109 | +## Contributing |
| 164 | 110 | ||
| 165 | -* `TR_getIndex(Indexable)`: Get a unique index of an instance. How this is | ||
| 166 | - created is subject of the concrete implementation. | ||
| 167 | - | ||
| 168 | -#### selector functions #### | ||
| 169 | - | ||
| 170 | -* `TR_serializedSize(Serializable)`: Get the size of the serialized instance. | ||
| 171 | -* `TR_serialize(Serializable, unsigned char * serialized)`: Serialize the | ||
| 172 | - instance into the serialized buffer. The buffer has to be large enough to | ||
| 173 | - hold the serialized instance. | ||
| 174 | -* `TR_unserialize(Serializable, const unsigned char * serialized, size_t ssize)`: | ||
| 175 | - Initialize the instance with the serialized data stored in serialized. | ||
| 176 | - | ||
| 177 | -#### memory management - functions #### | ||
| 178 | - | ||
| 179 | -* `void * TR_malloc(size_t)`: | ||
| 180 | -* `void * TR_calloc(size_t, size_t)`: | ||
| 181 | -* `void * TR_reference(void *)`: | ||
| 182 | -* `size_t TR_getSize(void *)`: | ||
| 183 | -* `void TR_cleanup()`: | ||
| 184 | - | ||
| 185 | -#### memory management - macros #### | ||
| 186 | - | ||
| 187 | -* `TR_MEM_FREE(seg)`: | ||
| 188 | - | ||
| 189 | - | ||
| 190 | -### EXAMPLE ### | ||
| 191 | - | ||
| 192 | -#### optimized memory management #### | ||
| 193 | - | ||
| 194 | -#### create a new class #### | ||
| 195 | - | ||
| 196 | -#### create a new interface #### | ||
| 197 | - | ||
| 198 | -#### implement an interface in a class #### | ||
| 199 | - | ||
| 200 | -#### class extension #### | ||
| 201 | - | ||
| 202 | -TESTING | ||
| 203 | -------- | 111 | +I would really like to see some people possibly interested in this stuff. |
| 112 | +I think it contains some really interesting ideas. | ||
| 204 | 113 | ||
| 205 | -This comes with the start of a unit test suite. | ||
| 206 | -You can use *make test* to build and run the existent tests. | 114 | +If you like to contribute, contact me via email. You are free to clone |
| 115 | +and play with this code. | ||
| 207 | 116 | ||
| 208 | -### REQUIREMENTS | 117 | +## License |
| 209 | 118 | ||
| 210 | -Currently, you need valgrind to build the tests, because some memory checking | ||
| 211 | -is done by the way. | 119 | +GNU General Public License (Version 3) |
| 212 | 120 | ||
| 213 | -CONTRIBUTION | ||
| 214 | ------------- | 121 | +> This program is free software: you can redistribute it and/or modify |
| 122 | +> it under the terms of the GNU General Public License as published by | ||
| 123 | +> the Free Software Foundation, either version 3 of the License, or | ||
| 124 | +> (at your option) any later version. | ||
| 125 | +> | ||
| 126 | +> This program is distributed in the hope that it will be useful, | ||
| 127 | +> but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 128 | +> MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 129 | +> GNU General Public License for more details. | ||
| 130 | +> | ||
| 131 | +> You should have received a copy of the GNU General Public License | ||
| 132 | +> along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
| 215 | 133 | ||
| 216 | -I would really like to see some people possibly interested in this stuff. | ||
| 217 | -I think it contains some really interesting ideas. | 134 | +## Author |
| 218 | 135 | ||
| 219 | -If you like to contribute anyway, make a fork, do your changes and generate | ||
| 220 | -a pull request. Or simply contact me on georg@steffers.org. | 136 | +Georg Hopp <<georg@steffers.org>> |
Please
register
or
login
to post a comment