This package includes the SharkSSL lite library and header files.
Dependents: WebSocket-Client-Example SharkMQ-LED-Demo
SharkSSL-Lite
Description: SharkSSL is an SSL v3.0 TLS v1.0/1.1/1.2 implementation of the TLS and SSL protocol standard. With its array of compile-time options and Raycrypto proprietary cryptographic algorithms, SharkSSL can be fine-tuned to a footprint that occupies less than 20 kB, while maintaining full x.509 authentication. The SharkSSL-Lite download includes a subset of SharkSSL and header files made for use in non-commercial and for evaluation purposes.
Features
- SSL|TLS v1.2
- Size: 21kB
- Encryption: Elliptic Curve Cryptography (ECC) | ChaCha20/Poly1305
- SharkSSL Online Documentation
- SMQ (Simple Message Queues) Client and SMQ Documentation
- Secure WebSocket Client
- Secure MQTT Client
Examples
- SharkMQ LED Demo: Secure control of LEDs on your mbed board using a browser.
- WebSocket Client: Connect to ELIZA the Psychotherapist
Limitations
SharkSSL-Lite includes a limited set of ciphers. To use SharkSSL-Lite, the peer side must support Elliptic Curve Cryptography (ECC) and you must use ECC certificates. The peer side must also support the new ChaCha20/Poly1305 cipher combination.
ChaCha20 and Poly1305 for TLS is published RFC 7905. The development of this new cipher was a response to many attacks discovered against other widely used TLS cipher suites. ChaCha20 is the cipher and Poly1305 is an authenticated encryption mode.
SharkSSL-Lite occupies less than 20kB, while maintaining full x.509 authentication. The ChaCha20/Poly1305 cipher software implementation is equally as fast as many hardware accelerated AES engines.
Creating ECC Certificates for SharkSSL-Lite
The following video shows how to create an Elliptic Curve Cryptography (ECC) certificate for a server, how to install the certificate in the server, and how to make the mbed clients connecting to the server trust this certificate. The server in this video is installed on a private/personal computer on a private network for test purposes. The video was produced for the embedded.com article How to run your own secure IoT cloud server.
inc/DoubleList.h@1:d5e0e1dcf0d6, 2016-05-23 (annotated)
- Committer:
- wini
- Date:
- Mon May 23 13:56:30 2016 +0000
- Revision:
- 1:d5e0e1dcf0d6
- Parent:
- 0:e0adec41ad6b
Type conflict fix (U8-U32) for latest mbed release.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
wini | 0:e0adec41ad6b | 1 | /* |
wini | 0:e0adec41ad6b | 2 | * ____ _________ __ _ |
wini | 0:e0adec41ad6b | 3 | * / __ \___ ____ _/ /_ __(_)___ ___ ___ / / ____ ____ _(_)____ |
wini | 0:e0adec41ad6b | 4 | * / /_/ / _ \/ __ `/ / / / / / __ `__ \/ _ \/ / / __ \/ __ `/ / ___/ |
wini | 0:e0adec41ad6b | 5 | * / _, _/ __/ /_/ / / / / / / / / / / / __/ /___/ /_/ / /_/ / / /__ |
wini | 0:e0adec41ad6b | 6 | * /_/ |_|\___/\__,_/_/ /_/ /_/_/ /_/ /_/\___/_____/\____/\__, /_/\___/ |
wini | 0:e0adec41ad6b | 7 | * /____/ |
wini | 0:e0adec41ad6b | 8 | * |
wini | 0:e0adec41ad6b | 9 | * Barracuda Embedded Web-Server |
wini | 0:e0adec41ad6b | 10 | * |
wini | 0:e0adec41ad6b | 11 | **************************************************************************** |
wini | 0:e0adec41ad6b | 12 | * HEADER |
wini | 0:e0adec41ad6b | 13 | * |
wini | 0:e0adec41ad6b | 14 | * $Id: DoubleList.h 2881 2013-04-22 22:34:04Z wini $ |
wini | 0:e0adec41ad6b | 15 | * |
wini | 0:e0adec41ad6b | 16 | * COPYRIGHT: Real Time Logic, 2004 - 2012 |
wini | 0:e0adec41ad6b | 17 | * |
wini | 0:e0adec41ad6b | 18 | * This software is copyrighted by and is the sole property of Real |
wini | 0:e0adec41ad6b | 19 | * Time Logic LLC. All rights, title, ownership, or other interests in |
wini | 0:e0adec41ad6b | 20 | * the software remain the property of Real Time Logic LLC. This |
wini | 0:e0adec41ad6b | 21 | * software may only be used in accordance with the terms and |
wini | 0:e0adec41ad6b | 22 | * conditions stipulated in the corresponding license agreement under |
wini | 0:e0adec41ad6b | 23 | * which the software has been supplied. Any unauthorized use, |
wini | 0:e0adec41ad6b | 24 | * duplication, transmission, distribution, or disclosure of this |
wini | 0:e0adec41ad6b | 25 | * software is expressly forbidden. |
wini | 0:e0adec41ad6b | 26 | * |
wini | 0:e0adec41ad6b | 27 | * This Copyright notice may not be removed or modified without prior |
wini | 0:e0adec41ad6b | 28 | * written consent of Real Time Logic LLC. |
wini | 0:e0adec41ad6b | 29 | * |
wini | 0:e0adec41ad6b | 30 | * Real Time Logic LLC. reserves the right to modify this software |
wini | 0:e0adec41ad6b | 31 | * without notice. |
wini | 0:e0adec41ad6b | 32 | * |
wini | 0:e0adec41ad6b | 33 | * http://www.realtimelogic.com |
wini | 0:e0adec41ad6b | 34 | **************************************************************************** |
wini | 0:e0adec41ad6b | 35 | * |
wini | 0:e0adec41ad6b | 36 | * DiskIo implements the abstract class IoIntf. See the reference |
wini | 0:e0adec41ad6b | 37 | * manual for more information on the IoIntf (IO interface) |
wini | 0:e0adec41ad6b | 38 | * requirements. |
wini | 0:e0adec41ad6b | 39 | * |
wini | 0:e0adec41ad6b | 40 | * This is a generic header file for all file systems and |
wini | 0:e0adec41ad6b | 41 | * platforms. See the sub-directories for platform specific |
wini | 0:e0adec41ad6b | 42 | * implementations. |
wini | 0:e0adec41ad6b | 43 | */ |
wini | 0:e0adec41ad6b | 44 | |
wini | 0:e0adec41ad6b | 45 | #ifndef _DoubleList_h |
wini | 0:e0adec41ad6b | 46 | #define _DoubleList_h |
wini | 0:e0adec41ad6b | 47 | |
wini | 0:e0adec41ad6b | 48 | #include <TargConfig.h> |
wini | 0:e0adec41ad6b | 49 | |
wini | 0:e0adec41ad6b | 50 | struct DoubleList; |
wini | 0:e0adec41ad6b | 51 | |
wini | 0:e0adec41ad6b | 52 | typedef struct DoubleLink |
wini | 0:e0adec41ad6b | 53 | { |
wini | 0:e0adec41ad6b | 54 | #ifdef __cplusplus |
wini | 0:e0adec41ad6b | 55 | void *operator new(size_t s) { return ::baMalloc(s); } |
wini | 0:e0adec41ad6b | 56 | void operator delete(void* d) { if(d) ::baFree(d); } |
wini | 0:e0adec41ad6b | 57 | void *operator new(size_t, void *place) { return place; } |
wini | 0:e0adec41ad6b | 58 | void operator delete(void*, void *) { } |
wini | 0:e0adec41ad6b | 59 | DoubleLink(); |
wini | 0:e0adec41ad6b | 60 | ~DoubleLink(); |
wini | 0:e0adec41ad6b | 61 | void insertAfter(DoubleLink* newLink); |
wini | 0:e0adec41ad6b | 62 | void insertBefore(DoubleLink* newLink); |
wini | 0:e0adec41ad6b | 63 | void unlink(); |
wini | 0:e0adec41ad6b | 64 | bool isLinked(); |
wini | 0:e0adec41ad6b | 65 | DoubleLink* getNext(); |
wini | 0:e0adec41ad6b | 66 | #endif |
wini | 0:e0adec41ad6b | 67 | struct DoubleLink* next; |
wini | 0:e0adec41ad6b | 68 | struct DoubleLink* prev; |
wini | 0:e0adec41ad6b | 69 | } DoubleLink; |
wini | 0:e0adec41ad6b | 70 | |
wini | 0:e0adec41ad6b | 71 | |
wini | 0:e0adec41ad6b | 72 | |
wini | 0:e0adec41ad6b | 73 | typedef struct DoubleList |
wini | 0:e0adec41ad6b | 74 | { |
wini | 0:e0adec41ad6b | 75 | #ifdef __cplusplus |
wini | 0:e0adec41ad6b | 76 | DoubleList(); |
wini | 0:e0adec41ad6b | 77 | void insertFirst(DoubleLink* newLink); |
wini | 0:e0adec41ad6b | 78 | void insertLast(DoubleLink* newLink); |
wini | 0:e0adec41ad6b | 79 | bool isLast(DoubleLink* n); |
wini | 0:e0adec41ad6b | 80 | DoubleLink* firstNode(); |
wini | 0:e0adec41ad6b | 81 | DoubleLink* lastNode(); |
wini | 0:e0adec41ad6b | 82 | bool isEmpty(); |
wini | 0:e0adec41ad6b | 83 | DoubleLink* removeFirst(); |
wini | 0:e0adec41ad6b | 84 | bool isInList(DoubleLink* n); |
wini | 0:e0adec41ad6b | 85 | #endif |
wini | 0:e0adec41ad6b | 86 | DoubleLink* next; |
wini | 0:e0adec41ad6b | 87 | DoubleLink* prev; |
wini | 0:e0adec41ad6b | 88 | } DoubleList; |
wini | 0:e0adec41ad6b | 89 | |
wini | 0:e0adec41ad6b | 90 | |
wini | 0:e0adec41ad6b | 91 | #define DoubleLink_constructor(o) do { \ |
wini | 0:e0adec41ad6b | 92 | ((DoubleLink*)o)->next = 0; \ |
wini | 0:e0adec41ad6b | 93 | ((DoubleLink*)o)->prev = 0; \ |
wini | 0:e0adec41ad6b | 94 | } while(0) |
wini | 0:e0adec41ad6b | 95 | |
wini | 0:e0adec41ad6b | 96 | |
wini | 0:e0adec41ad6b | 97 | #define DoubleLink_destructor(o) do { \ |
wini | 0:e0adec41ad6b | 98 | if(DoubleLink_isLinked(o)) \ |
wini | 0:e0adec41ad6b | 99 | DoubleLink_unlink(o); \ |
wini | 0:e0adec41ad6b | 100 | } while(0) |
wini | 0:e0adec41ad6b | 101 | |
wini | 0:e0adec41ad6b | 102 | #define DoubleLink_insertAfter(o, newLink) do { \ |
wini | 0:e0adec41ad6b | 103 | baAssert(((DoubleLink*)newLink)->prev==0&&((DoubleLink*)newLink)->next==0);\ |
wini | 0:e0adec41ad6b | 104 | ((DoubleLink*)newLink)->next = ((DoubleLink*)o)->next; \ |
wini | 0:e0adec41ad6b | 105 | ((DoubleLink*)newLink)->prev = ((DoubleLink*)o); \ |
wini | 0:e0adec41ad6b | 106 | ((DoubleLink*)o)->next->prev = ((DoubleLink*)newLink); \ |
wini | 0:e0adec41ad6b | 107 | ((DoubleLink*)o)->next = ((DoubleLink*)newLink); \ |
wini | 0:e0adec41ad6b | 108 | } while(0) |
wini | 0:e0adec41ad6b | 109 | |
wini | 0:e0adec41ad6b | 110 | |
wini | 0:e0adec41ad6b | 111 | #define DoubleLink_insertBefore(o, newLink) do { \ |
wini | 0:e0adec41ad6b | 112 | baAssert(((DoubleLink*)newLink)->prev==0&&((DoubleLink*)newLink)->next==0);\ |
wini | 0:e0adec41ad6b | 113 | ((DoubleLink*)newLink)->prev = ((DoubleLink*)o)->prev; \ |
wini | 0:e0adec41ad6b | 114 | ((DoubleLink*)newLink)->next = ((DoubleLink*)o); \ |
wini | 0:e0adec41ad6b | 115 | ((DoubleLink*)o)->prev->next = ((DoubleLink*) newLink); \ |
wini | 0:e0adec41ad6b | 116 | ((DoubleLink*)o)->prev = ((DoubleLink*) newLink); \ |
wini | 0:e0adec41ad6b | 117 | } while(0) |
wini | 0:e0adec41ad6b | 118 | |
wini | 0:e0adec41ad6b | 119 | |
wini | 0:e0adec41ad6b | 120 | #define DoubleLink_unlink(o) do { \ |
wini | 0:e0adec41ad6b | 121 | baAssert(((DoubleLink*)o)->prev && ((DoubleLink*)o)->next);\ |
wini | 0:e0adec41ad6b | 122 | ((DoubleLink*) o)->next->prev = ((DoubleLink*)o)->prev; \ |
wini | 0:e0adec41ad6b | 123 | ((DoubleLink*) o)->prev->next = ((DoubleLink*)o)->next; \ |
wini | 0:e0adec41ad6b | 124 | ((DoubleLink*) o)->next = 0; \ |
wini | 0:e0adec41ad6b | 125 | ((DoubleLink*) o)->prev = 0; \ |
wini | 0:e0adec41ad6b | 126 | } while(0) |
wini | 0:e0adec41ad6b | 127 | |
wini | 0:e0adec41ad6b | 128 | #ifdef NDEBUG |
wini | 0:e0adec41ad6b | 129 | #define DoubleLink_isLinked(o) \ |
wini | 0:e0adec41ad6b | 130 | (((DoubleLink*)o)->prev ? TRUE : FALSE) |
wini | 0:e0adec41ad6b | 131 | #else |
wini | 0:e0adec41ad6b | 132 | #define DoubleLink_isLinked(o) \ |
wini | 0:e0adec41ad6b | 133 | (((DoubleLink*)o)->prev ? (baAssert(((DoubleLink*)o)->next), TRUE) : FALSE) |
wini | 0:e0adec41ad6b | 134 | #endif |
wini | 0:e0adec41ad6b | 135 | |
wini | 0:e0adec41ad6b | 136 | #define DoubleLink_getNext(o) ((DoubleLink*)(o))->next |
wini | 0:e0adec41ad6b | 137 | |
wini | 0:e0adec41ad6b | 138 | |
wini | 0:e0adec41ad6b | 139 | #define DoubleList_constructor(o) do { \ |
wini | 0:e0adec41ad6b | 140 | (o)->next = (DoubleLink*)o; \ |
wini | 0:e0adec41ad6b | 141 | (o)->prev = (DoubleLink*)o; \ |
wini | 0:e0adec41ad6b | 142 | } while(0) |
wini | 0:e0adec41ad6b | 143 | |
wini | 0:e0adec41ad6b | 144 | |
wini | 0:e0adec41ad6b | 145 | #define DoubleList_insertFirst(o, newLink) do { \ |
wini | 0:e0adec41ad6b | 146 | baAssert(((DoubleLink*)newLink)->prev==0&&((DoubleLink*)newLink)->next==0);\ |
wini | 0:e0adec41ad6b | 147 | ((DoubleLink*)newLink)->next = (o)->next; \ |
wini | 0:e0adec41ad6b | 148 | ((DoubleLink*)newLink)->prev = (DoubleLink*)o; \ |
wini | 0:e0adec41ad6b | 149 | (o)->next->prev = ((DoubleLink*) newLink); \ |
wini | 0:e0adec41ad6b | 150 | (o)->next = ((DoubleLink*) newLink); \ |
wini | 0:e0adec41ad6b | 151 | } while(0) |
wini | 0:e0adec41ad6b | 152 | |
wini | 0:e0adec41ad6b | 153 | |
wini | 0:e0adec41ad6b | 154 | #define DoubleList_insertLast(o, newLink) do { \ |
wini | 0:e0adec41ad6b | 155 | baAssert(((DoubleLink*)newLink)->prev==0&&((DoubleLink*)newLink)->next==0);\ |
wini | 0:e0adec41ad6b | 156 | ((DoubleLink*)newLink)->next = (DoubleLink*)o; \ |
wini | 0:e0adec41ad6b | 157 | ((DoubleLink*)newLink)->prev = (o)->prev; \ |
wini | 0:e0adec41ad6b | 158 | (o)->prev->next = ((DoubleLink*)newLink); \ |
wini | 0:e0adec41ad6b | 159 | (o)->prev = ((DoubleLink*)newLink); \ |
wini | 0:e0adec41ad6b | 160 | } while(0) |
wini | 0:e0adec41ad6b | 161 | |
wini | 0:e0adec41ad6b | 162 | |
wini | 0:e0adec41ad6b | 163 | #define DoubleList_isLast(o, n) (((DoubleLink*)(n))->next == (DoubleLink*)(o)) |
wini | 0:e0adec41ad6b | 164 | #define DoubleList_isEnd(o, n) ((DoubleLink*)(n) == (DoubleLink*)(o)) |
wini | 0:e0adec41ad6b | 165 | |
wini | 0:e0adec41ad6b | 166 | #define DoubleList_firstNode(o) \ |
wini | 0:e0adec41ad6b | 167 | ((o)->next != (DoubleLink*)o ? (o)->next : 0) |
wini | 0:e0adec41ad6b | 168 | |
wini | 0:e0adec41ad6b | 169 | |
wini | 0:e0adec41ad6b | 170 | #define DoubleList_lastNode(o) \ |
wini | 0:e0adec41ad6b | 171 | ((o)->prev != (DoubleLink*)o ? (o)->prev : 0) |
wini | 0:e0adec41ad6b | 172 | |
wini | 0:e0adec41ad6b | 173 | |
wini | 0:e0adec41ad6b | 174 | |
wini | 0:e0adec41ad6b | 175 | #define DoubleList_isEmpty(o) \ |
wini | 0:e0adec41ad6b | 176 | (((DoubleLink*)(o))->next == (DoubleLink*)(o)) |
wini | 0:e0adec41ad6b | 177 | |
wini | 0:e0adec41ad6b | 178 | |
wini | 0:e0adec41ad6b | 179 | #ifdef __cplusplus |
wini | 0:e0adec41ad6b | 180 | extern "C" { |
wini | 0:e0adec41ad6b | 181 | #endif |
wini | 0:e0adec41ad6b | 182 | |
wini | 0:e0adec41ad6b | 183 | BA_API DoubleLink* DoubleList_removeFirst(DoubleList* o); |
wini | 0:e0adec41ad6b | 184 | |
wini | 0:e0adec41ad6b | 185 | /* Returns true if the node is in any list. You cannot |
wini | 0:e0adec41ad6b | 186 | * use this function for testing if the node is in a particular list, that |
wini | 0:e0adec41ad6b | 187 | * is your problem. The function performs some additional tests if |
wini | 0:e0adec41ad6b | 188 | * NDEBUG is not defined and asserts that if the node is in a list, it should |
wini | 0:e0adec41ad6b | 189 | * be in this list. |
wini | 0:e0adec41ad6b | 190 | */ |
wini | 0:e0adec41ad6b | 191 | #ifdef NDEBUG |
wini | 0:e0adec41ad6b | 192 | #define DoubleList_isInList(o, node) (((DoubleLink*)node)->prev ? TRUE : FALSE) |
wini | 0:e0adec41ad6b | 193 | #else |
wini | 0:e0adec41ad6b | 194 | #define DoubleList_isInList(o, node) DoubleList_isInListF(o, node, __FILE__, __LINE__) |
wini | 0:e0adec41ad6b | 195 | BA_API BaBool DoubleList_isInListF(DoubleList* o,void* node,const char* file,int line); |
wini | 0:e0adec41ad6b | 196 | #endif |
wini | 0:e0adec41ad6b | 197 | |
wini | 0:e0adec41ad6b | 198 | |
wini | 0:e0adec41ad6b | 199 | #ifdef __cplusplus |
wini | 0:e0adec41ad6b | 200 | } |
wini | 0:e0adec41ad6b | 201 | inline DoubleLink::DoubleLink() { |
wini | 0:e0adec41ad6b | 202 | DoubleLink_constructor(this); |
wini | 0:e0adec41ad6b | 203 | } |
wini | 0:e0adec41ad6b | 204 | inline DoubleLink::~DoubleLink() { |
wini | 0:e0adec41ad6b | 205 | DoubleLink_destructor(this); |
wini | 0:e0adec41ad6b | 206 | } |
wini | 0:e0adec41ad6b | 207 | inline void DoubleLink::insertAfter(DoubleLink* newLink) { |
wini | 0:e0adec41ad6b | 208 | DoubleLink_insertAfter(this, newLink); |
wini | 0:e0adec41ad6b | 209 | } |
wini | 0:e0adec41ad6b | 210 | inline void DoubleLink::insertBefore(DoubleLink* newLink) { |
wini | 0:e0adec41ad6b | 211 | DoubleLink_insertBefore(this, newLink); |
wini | 0:e0adec41ad6b | 212 | } |
wini | 0:e0adec41ad6b | 213 | inline void DoubleLink::unlink() { |
wini | 0:e0adec41ad6b | 214 | DoubleLink_unlink(this); |
wini | 0:e0adec41ad6b | 215 | } |
wini | 0:e0adec41ad6b | 216 | inline bool DoubleLink::isLinked() { |
wini | 0:e0adec41ad6b | 217 | return DoubleLink_isLinked(this) ? true : false; |
wini | 0:e0adec41ad6b | 218 | } |
wini | 0:e0adec41ad6b | 219 | inline DoubleLink* DoubleLink::getNext() { |
wini | 0:e0adec41ad6b | 220 | return DoubleLink_getNext(this); |
wini | 0:e0adec41ad6b | 221 | } |
wini | 0:e0adec41ad6b | 222 | inline DoubleList::DoubleList() { |
wini | 0:e0adec41ad6b | 223 | DoubleList_constructor(this); |
wini | 0:e0adec41ad6b | 224 | } |
wini | 0:e0adec41ad6b | 225 | inline void DoubleList::insertFirst(DoubleLink* newLink) { |
wini | 0:e0adec41ad6b | 226 | DoubleList_insertFirst(this, newLink); |
wini | 0:e0adec41ad6b | 227 | } |
wini | 0:e0adec41ad6b | 228 | inline void DoubleList::insertLast(DoubleLink* newLink) { |
wini | 0:e0adec41ad6b | 229 | DoubleList_insertLast(this, newLink); |
wini | 0:e0adec41ad6b | 230 | } |
wini | 0:e0adec41ad6b | 231 | inline bool DoubleList::isLast(DoubleLink* n) { |
wini | 0:e0adec41ad6b | 232 | return DoubleList_isLast(this, n) ? true : false; |
wini | 0:e0adec41ad6b | 233 | } |
wini | 0:e0adec41ad6b | 234 | inline DoubleLink* DoubleList::firstNode() { |
wini | 0:e0adec41ad6b | 235 | return DoubleList_firstNode(this); |
wini | 0:e0adec41ad6b | 236 | } |
wini | 0:e0adec41ad6b | 237 | inline DoubleLink* DoubleList::lastNode() { |
wini | 0:e0adec41ad6b | 238 | return DoubleList_lastNode(this); |
wini | 0:e0adec41ad6b | 239 | } |
wini | 0:e0adec41ad6b | 240 | inline bool DoubleList::isEmpty() { |
wini | 0:e0adec41ad6b | 241 | return DoubleList_isEmpty(this) ? true : false; |
wini | 0:e0adec41ad6b | 242 | } |
wini | 0:e0adec41ad6b | 243 | inline DoubleLink* DoubleList::removeFirst() { |
wini | 0:e0adec41ad6b | 244 | return DoubleList_removeFirst(this); |
wini | 0:e0adec41ad6b | 245 | } |
wini | 0:e0adec41ad6b | 246 | inline bool DoubleList::isInList(DoubleLink* n) { |
wini | 0:e0adec41ad6b | 247 | return DoubleList_isInList(this, n) ? true : false; |
wini | 0:e0adec41ad6b | 248 | } |
wini | 0:e0adec41ad6b | 249 | #endif |
wini | 0:e0adec41ad6b | 250 | |
wini | 0:e0adec41ad6b | 251 | |
wini | 0:e0adec41ad6b | 252 | |
wini | 0:e0adec41ad6b | 253 | |
wini | 0:e0adec41ad6b | 254 | /*=========================================================================== |
wini | 0:e0adec41ad6b | 255 | * |
wini | 0:e0adec41ad6b | 256 | * Class: DoubleListEnumerator |
wini | 0:e0adec41ad6b | 257 | *--------------------------------------------------------------------------- |
wini | 0:e0adec41ad6b | 258 | * Description: |
wini | 0:e0adec41ad6b | 259 | * Usage: |
wini | 0:e0adec41ad6b | 260 | * DoubleListEnumerator e(list); |
wini | 0:e0adec41ad6b | 261 | * for(DoubleLink* link = e.getElement() ; link ; link = e.nextElement()) |
wini | 0:e0adec41ad6b | 262 | * or |
wini | 0:e0adec41ad6b | 263 | * DoubleListEnumerator e(list); |
wini | 0:e0adec41ad6b | 264 | * DoubleLink* link = e.getElement(); |
wini | 0:e0adec41ad6b | 265 | * while(link) |
wini | 0:e0adec41ad6b | 266 | * { |
wini | 0:e0adec41ad6b | 267 | * if(link bla bla) |
wini | 0:e0adec41ad6b | 268 | * //Deletes current element and returns next element |
wini | 0:e0adec41ad6b | 269 | * link = e.deleteElement(); |
wini | 0:e0adec41ad6b | 270 | * else |
wini | 0:e0adec41ad6b | 271 | * link = e.nextElement(); |
wini | 0:e0adec41ad6b | 272 | * } |
wini | 0:e0adec41ad6b | 273 | */ |
wini | 0:e0adec41ad6b | 274 | typedef struct DoubleListEnumerator |
wini | 0:e0adec41ad6b | 275 | { |
wini | 0:e0adec41ad6b | 276 | #ifdef __cplusplus |
wini | 0:e0adec41ad6b | 277 | DoubleListEnumerator(){} |
wini | 0:e0adec41ad6b | 278 | DoubleListEnumerator(DoubleList* list); |
wini | 0:e0adec41ad6b | 279 | DoubleLink* getElement(); |
wini | 0:e0adec41ad6b | 280 | DoubleLink* nextElement(); |
wini | 0:e0adec41ad6b | 281 | DoubleLink* removeElement(); |
wini | 0:e0adec41ad6b | 282 | private: |
wini | 0:e0adec41ad6b | 283 | #endif |
wini | 0:e0adec41ad6b | 284 | DoubleList* list; |
wini | 0:e0adec41ad6b | 285 | DoubleLink* curElement; |
wini | 0:e0adec41ad6b | 286 | } DoubleListEnumerator; |
wini | 0:e0adec41ad6b | 287 | |
wini | 0:e0adec41ad6b | 288 | #define DoubleListEnumerator_constructor(o, listMA) do \ |
wini | 0:e0adec41ad6b | 289 | { \ |
wini | 0:e0adec41ad6b | 290 | (o)->list = listMA; \ |
wini | 0:e0adec41ad6b | 291 | (o)->curElement = DoubleList_firstNode((o)->list);\ |
wini | 0:e0adec41ad6b | 292 | } while(0) |
wini | 0:e0adec41ad6b | 293 | |
wini | 0:e0adec41ad6b | 294 | #define DoubleListEnumerator_getElement(o) (o)->curElement |
wini | 0:e0adec41ad6b | 295 | |
wini | 0:e0adec41ad6b | 296 | #define DoubleListEnumerator_nextElement(o) \ |
wini | 0:e0adec41ad6b | 297 | ((o)->curElement ? ( \ |
wini | 0:e0adec41ad6b | 298 | (o)->curElement = (o)->curElement->next == (DoubleLink*)(o)->list ? 0 : (o)->curElement->next, \ |
wini | 0:e0adec41ad6b | 299 | (o)->curElement \ |
wini | 0:e0adec41ad6b | 300 | ) : 0) |
wini | 0:e0adec41ad6b | 301 | |
wini | 0:e0adec41ad6b | 302 | #ifdef __cplusplus |
wini | 0:e0adec41ad6b | 303 | extern "C" { |
wini | 0:e0adec41ad6b | 304 | #endif |
wini | 0:e0adec41ad6b | 305 | BA_API DoubleLink* DoubleListEnumerator_removeElement(DoubleListEnumerator* o); |
wini | 0:e0adec41ad6b | 306 | #ifdef __cplusplus |
wini | 0:e0adec41ad6b | 307 | } |
wini | 0:e0adec41ad6b | 308 | inline DoubleListEnumerator::DoubleListEnumerator(DoubleList* list) { |
wini | 0:e0adec41ad6b | 309 | DoubleListEnumerator_constructor(this, list); } |
wini | 0:e0adec41ad6b | 310 | inline DoubleLink* |
wini | 0:e0adec41ad6b | 311 | DoubleListEnumerator::removeElement() { |
wini | 0:e0adec41ad6b | 312 | return DoubleListEnumerator_removeElement(this); } |
wini | 0:e0adec41ad6b | 313 | inline DoubleLink* |
wini | 0:e0adec41ad6b | 314 | DoubleListEnumerator::getElement() {return DoubleListEnumerator_getElement(this);} |
wini | 0:e0adec41ad6b | 315 | inline DoubleLink* |
wini | 0:e0adec41ad6b | 316 | DoubleListEnumerator::nextElement() {return DoubleListEnumerator_nextElement(this); } |
wini | 0:e0adec41ad6b | 317 | #endif |
wini | 0:e0adec41ad6b | 318 | |
wini | 0:e0adec41ad6b | 319 | |
wini | 0:e0adec41ad6b | 320 | #endif |