mirror of
https://github.com/arendst/Tasmota.git
synced 2026-07-28 04:15:53 +00:00
Moved LinkedList to lib_div
This commit is contained in:
@@ -0,0 +1,21 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2015 Ivan Seidel
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
@@ -0,0 +1,419 @@
|
||||
/*
|
||||
LinkedList.h - V1.1 - Generic LinkedList implementation
|
||||
Works better with FIFO, because LIFO will need to
|
||||
search the entire List to find the last one;
|
||||
|
||||
For instructions, go to https://github.com/ivanseidel/LinkedList
|
||||
|
||||
Created by Ivan Seidel Gomes, March, 2013.
|
||||
Released into the public domain.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef LinkedList_h
|
||||
#define LinkedList_h
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
template<class T>
|
||||
struct ListNode
|
||||
{
|
||||
T data;
|
||||
ListNode<T> *next;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
class LinkedList{
|
||||
|
||||
protected:
|
||||
int _size;
|
||||
ListNode<T> *root;
|
||||
ListNode<T> *last;
|
||||
|
||||
// Helps "get" method, by saving last position
|
||||
ListNode<T> *lastNodeGot;
|
||||
int lastIndexGot;
|
||||
// isCached should be set to FALSE
|
||||
// everytime the list suffer changes
|
||||
bool isCached;
|
||||
|
||||
ListNode<T>* getNode(int index);
|
||||
|
||||
ListNode<T>* findEndOfSortedString(ListNode<T> *p, int (*cmp)(T &, T &));
|
||||
|
||||
public:
|
||||
LinkedList();
|
||||
LinkedList(int sizeIndex, T _t); //initiate list size and default value
|
||||
~LinkedList();
|
||||
|
||||
/*
|
||||
Returns current size of LinkedList
|
||||
*/
|
||||
virtual int size();
|
||||
/*
|
||||
Adds a T object in the specified index;
|
||||
Unlink and link the LinkedList correcly;
|
||||
Increment _size
|
||||
*/
|
||||
virtual bool add(int index, T);
|
||||
/*
|
||||
Adds a T object in the end of the LinkedList;
|
||||
Increment _size;
|
||||
*/
|
||||
virtual bool add(T);
|
||||
/*
|
||||
Adds a T object in the start of the LinkedList;
|
||||
Increment _size;
|
||||
*/
|
||||
virtual bool unshift(T);
|
||||
/*
|
||||
Set the object at index, with T;
|
||||
*/
|
||||
virtual bool set(int index, T);
|
||||
/*
|
||||
Remove object at index;
|
||||
If index is not reachable, returns false;
|
||||
else, decrement _size
|
||||
*/
|
||||
virtual T remove(int index);
|
||||
/*
|
||||
Remove last object;
|
||||
*/
|
||||
virtual T pop();
|
||||
/*
|
||||
Remove first object;
|
||||
*/
|
||||
virtual T shift();
|
||||
/*
|
||||
Get the index'th element on the list;
|
||||
Return Element if accessible,
|
||||
else, return false;
|
||||
*/
|
||||
virtual T get(int index);
|
||||
|
||||
/*
|
||||
Clear the entire array
|
||||
*/
|
||||
virtual void clear();
|
||||
|
||||
/*
|
||||
Sort the list, given a comparison function
|
||||
*/
|
||||
virtual void sort(int (*cmp)(T &, T &));
|
||||
|
||||
// add support to array brakets [] operator
|
||||
inline T& operator[](int index);
|
||||
inline T& operator[](size_t& i) { return this->get(i); }
|
||||
inline const T& operator[](const size_t& i) const { return this->get(i); }
|
||||
|
||||
};
|
||||
|
||||
// Initialize LinkedList with false values
|
||||
template<typename T>
|
||||
LinkedList<T>::LinkedList()
|
||||
{
|
||||
root=NULL;
|
||||
last=NULL;
|
||||
_size=0;
|
||||
|
||||
lastNodeGot = root;
|
||||
lastIndexGot = 0;
|
||||
isCached = false;
|
||||
}
|
||||
|
||||
// Clear Nodes and free Memory
|
||||
template<typename T>
|
||||
LinkedList<T>::~LinkedList()
|
||||
{
|
||||
ListNode<T>* tmp;
|
||||
while(root!=NULL)
|
||||
{
|
||||
tmp=root;
|
||||
root=root->next;
|
||||
delete tmp;
|
||||
}
|
||||
last = NULL;
|
||||
_size=0;
|
||||
isCached = false;
|
||||
}
|
||||
|
||||
/*
|
||||
Actualy "logic" coding
|
||||
*/
|
||||
|
||||
template<typename T>
|
||||
ListNode<T>* LinkedList<T>::getNode(int index){
|
||||
|
||||
int _pos = 0;
|
||||
ListNode<T>* current = root;
|
||||
|
||||
// Check if the node trying to get is
|
||||
// immediatly AFTER the previous got one
|
||||
if(isCached && lastIndexGot <= index){
|
||||
_pos = lastIndexGot;
|
||||
current = lastNodeGot;
|
||||
}
|
||||
|
||||
while(_pos < index && current){
|
||||
current = current->next;
|
||||
|
||||
_pos++;
|
||||
}
|
||||
|
||||
// Check if the object index got is the same as the required
|
||||
if(_pos == index){
|
||||
isCached = true;
|
||||
lastIndexGot = index;
|
||||
lastNodeGot = current;
|
||||
|
||||
return current;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
int LinkedList<T>::size(){
|
||||
return _size;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
LinkedList<T>::LinkedList(int sizeIndex, T _t){
|
||||
for (int i = 0; i < sizeIndex; i++){
|
||||
add(_t);
|
||||
}
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
bool LinkedList<T>::add(int index, T _t){
|
||||
|
||||
if(index >= _size)
|
||||
return add(_t);
|
||||
|
||||
if(index == 0)
|
||||
return unshift(_t);
|
||||
|
||||
ListNode<T> *tmp = new ListNode<T>(),
|
||||
*_prev = getNode(index-1);
|
||||
tmp->data = _t;
|
||||
tmp->next = _prev->next;
|
||||
_prev->next = tmp;
|
||||
|
||||
_size++;
|
||||
isCached = false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
bool LinkedList<T>::add(T _t){
|
||||
|
||||
ListNode<T> *tmp = new ListNode<T>();
|
||||
tmp->data = _t;
|
||||
tmp->next = NULL;
|
||||
|
||||
if(root){
|
||||
// Already have elements inserted
|
||||
last->next = tmp;
|
||||
last = tmp;
|
||||
}else{
|
||||
// First element being inserted
|
||||
root = tmp;
|
||||
last = tmp;
|
||||
}
|
||||
|
||||
_size++;
|
||||
isCached = false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
bool LinkedList<T>::unshift(T _t){
|
||||
|
||||
if(_size == 0)
|
||||
return add(_t);
|
||||
|
||||
ListNode<T> *tmp = new ListNode<T>();
|
||||
tmp->next = root;
|
||||
tmp->data = _t;
|
||||
root = tmp;
|
||||
|
||||
_size++;
|
||||
isCached = false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
template<typename T>
|
||||
T& LinkedList<T>::operator[](int index) {
|
||||
return getNode(index)->data;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
bool LinkedList<T>::set(int index, T _t){
|
||||
// Check if index position is in bounds
|
||||
if(index < 0 || index >= _size)
|
||||
return false;
|
||||
|
||||
getNode(index)->data = _t;
|
||||
return true;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
T LinkedList<T>::pop(){
|
||||
if(_size <= 0)
|
||||
return T();
|
||||
|
||||
isCached = false;
|
||||
|
||||
if(_size >= 2){
|
||||
ListNode<T> *tmp = getNode(_size - 2);
|
||||
T ret = tmp->next->data;
|
||||
delete(tmp->next);
|
||||
tmp->next = NULL;
|
||||
last = tmp;
|
||||
_size--;
|
||||
return ret;
|
||||
}else{
|
||||
// Only one element left on the list
|
||||
T ret = root->data;
|
||||
delete(root);
|
||||
root = NULL;
|
||||
last = NULL;
|
||||
_size = 0;
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
T LinkedList<T>::shift(){
|
||||
if(_size <= 0)
|
||||
return T();
|
||||
|
||||
if(_size > 1){
|
||||
ListNode<T> *_next = root->next;
|
||||
T ret = root->data;
|
||||
delete(root);
|
||||
root = _next;
|
||||
_size --;
|
||||
isCached = false;
|
||||
|
||||
return ret;
|
||||
}else{
|
||||
// Only one left, then pop()
|
||||
return pop();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
T LinkedList<T>::remove(int index){
|
||||
if (index < 0 || index >= _size)
|
||||
{
|
||||
return T();
|
||||
}
|
||||
|
||||
if(index == 0)
|
||||
return shift();
|
||||
|
||||
if (index == _size-1)
|
||||
{
|
||||
return pop();
|
||||
}
|
||||
|
||||
ListNode<T> *tmp = getNode(index - 1);
|
||||
ListNode<T> *toDelete = tmp->next;
|
||||
T ret = toDelete->data;
|
||||
tmp->next = tmp->next->next;
|
||||
delete(toDelete);
|
||||
_size--;
|
||||
isCached = false;
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
template<typename T>
|
||||
T LinkedList<T>::get(int index){
|
||||
ListNode<T> *tmp = getNode(index);
|
||||
|
||||
return (tmp ? tmp->data : T());
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
void LinkedList<T>::clear(){
|
||||
while(size() > 0)
|
||||
shift();
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
void LinkedList<T>::sort(int (*cmp)(T &, T &)){
|
||||
if(_size < 2) return; // trivial case;
|
||||
|
||||
for(;;) {
|
||||
|
||||
ListNode<T> **joinPoint = &root;
|
||||
|
||||
while(*joinPoint) {
|
||||
ListNode<T> *a = *joinPoint;
|
||||
ListNode<T> *a_end = findEndOfSortedString(a, cmp);
|
||||
|
||||
if(!a_end->next ) {
|
||||
if(joinPoint == &root) {
|
||||
last = a_end;
|
||||
isCached = false;
|
||||
return;
|
||||
}
|
||||
else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
ListNode<T> *b = a_end->next;
|
||||
ListNode<T> *b_end = findEndOfSortedString(b, cmp);
|
||||
|
||||
ListNode<T> *tail = b_end->next;
|
||||
|
||||
a_end->next = NULL;
|
||||
b_end->next = NULL;
|
||||
|
||||
while(a && b) {
|
||||
if(cmp(a->data, b->data) <= 0) {
|
||||
*joinPoint = a;
|
||||
joinPoint = &a->next;
|
||||
a = a->next;
|
||||
}
|
||||
else {
|
||||
*joinPoint = b;
|
||||
joinPoint = &b->next;
|
||||
b = b->next;
|
||||
}
|
||||
}
|
||||
|
||||
if(a) {
|
||||
*joinPoint = a;
|
||||
while(a->next) a = a->next;
|
||||
a->next = tail;
|
||||
joinPoint = &a->next;
|
||||
}
|
||||
else {
|
||||
*joinPoint = b;
|
||||
while(b->next) b = b->next;
|
||||
b->next = tail;
|
||||
joinPoint = &b->next;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
ListNode<T>* LinkedList<T>::findEndOfSortedString(ListNode<T> *p, int (*cmp)(T &, T &)) {
|
||||
while(p->next && cmp(p->data, p->next->data) <= 0) {
|
||||
p = p->next;
|
||||
}
|
||||
|
||||
return p;
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,171 @@
|
||||
# LinkedList
|
||||
|
||||
This library was developed targeting **`Arduino`** applications. However, works just great with any C++.
|
||||
|
||||
Implementing a buffer for objects takes time. If we are not in the mood, we just create an `array[1000]` with enough size.
|
||||
|
||||
The objective of this library is to create a pattern for projects.
|
||||
If you need to use a List of: `int`, `float`, `objects`, `Lists` or `Wales`. **This is what you are looking for.**
|
||||
|
||||
With a simple but powerful caching algorithm, you can get subsequent objects much faster than usual. Tested without any problems with Lists bigger than 2000 members.
|
||||
|
||||
## Installation
|
||||
|
||||
1. [Download](https://github.com/ivanseidel/LinkedList/archive/master.zip) the Latest release from gitHub.
|
||||
2. Unzip and modify the Folder name to "LinkedList" (Remove the '-version')
|
||||
3. Paste the modified folder on your Library folder (On your `Libraries` folder inside Sketchbooks or Arduino software).
|
||||
4. Reopen the Arduino software.
|
||||
|
||||
**If you are here, because another Library requires this class, just don't waste time reading bellow. Install and ready.**
|
||||
|
||||
-------------------------
|
||||
|
||||
## Getting started
|
||||
|
||||
### The `LinkedList` class
|
||||
|
||||
In case you don't know what a LinkedList is and what it's used for, take a quick look at [Wikipedia::LinkedList](https://en.wikipedia.org/wiki/Linked_list) before continuing.
|
||||
|
||||
#### To declare a LinkedList object
|
||||
```c++
|
||||
// Instantiate a LinkedList that will hold 'integer'
|
||||
LinkedList<int> myLinkedList = LinkedList<int>();
|
||||
|
||||
// Or just this
|
||||
LinkedList<int> myLinkedList;
|
||||
|
||||
// But if you are instantiating a pointer LinkedList...
|
||||
LinkedList<int> *myLinkedList = new LinkedList<int>();
|
||||
|
||||
// If you want a LinkedList with any other type such as 'MyClass'
|
||||
// Make sure you call delete(MyClass) when you remove!
|
||||
LinkedList<MyClass> *myLinkedList = new LinkedList<MyClass>();
|
||||
```
|
||||
|
||||
#### Getting the size of the linked list
|
||||
```c++
|
||||
// To get the size of a linked list, make use of the size() method
|
||||
int theSize = myList.size();
|
||||
|
||||
// Notice that if it's pointer to the linked list, you should use -> instead
|
||||
int theSize = myList->size();
|
||||
```
|
||||
|
||||
#### Adding elements
|
||||
|
||||
```c++
|
||||
// add(obj) method will insert at the END of the list
|
||||
myList.add(myObject);
|
||||
|
||||
// add(index, obj) method will try to insert the object at the specified index
|
||||
myList.add(0, myObject); // Add at the beginning
|
||||
myList.add(3, myObject); // Add at index 3
|
||||
|
||||
// unshift(obj) method will insert the object at the beginning
|
||||
myList.unshift(myObject);
|
||||
```
|
||||
|
||||
#### Getting elements
|
||||
|
||||
```c++
|
||||
// get(index) will return the element at index
|
||||
// (notice that the start element is 0, not 1)
|
||||
|
||||
// Get the FIRST element
|
||||
myObject = myList.get(0);
|
||||
|
||||
// Get the third element
|
||||
myObject = myList.get(2);
|
||||
|
||||
// Get the LAST element
|
||||
myObject = myList.get(myList.size() - 1);
|
||||
```
|
||||
|
||||
#### Changing elements
|
||||
```c++
|
||||
// set(index, obj) method will change the object at index to obj
|
||||
|
||||
// Change the first element to myObject
|
||||
myList.set(0, myObject);
|
||||
|
||||
// Change the third element to myObject
|
||||
myList.set(2, myObject);
|
||||
|
||||
// Change the LAST element of the list
|
||||
myList.set(myList.size() - 1, myObject);
|
||||
```
|
||||
|
||||
#### Removing elements
|
||||
```c++
|
||||
// remove(index) will remove and return the element at index
|
||||
|
||||
// Remove the first object
|
||||
myList.remove(0);
|
||||
|
||||
// Get and Delete the third element
|
||||
myDeletedObject = myList.remove(2);
|
||||
|
||||
// pop() will remove and return the LAST element
|
||||
myDeletedObject = myList.pop();
|
||||
|
||||
// shift() will remove and return the FIRST element
|
||||
myDeletedObject = myList.shift();
|
||||
|
||||
// clear() will erase the entire list, leaving it with 0 elements
|
||||
// NOTE: Clear wont DELETE/FREE memory from Pointers, if you
|
||||
// are using Classes/Poiners, manualy delete and free those.
|
||||
myList.clear();
|
||||
```
|
||||
|
||||
------------------------
|
||||
|
||||
## Library Reference
|
||||
|
||||
### `ListNode` struct
|
||||
|
||||
- `T` `ListNode::data` - The object data
|
||||
|
||||
- `ListNode<T>` `*next` - Pointer to the next Node
|
||||
|
||||
### `LinkedList` class
|
||||
|
||||
**`boolean` methods returns if succeeded**
|
||||
|
||||
- `LinkedList<T>::LinkedList()` - Constructor.
|
||||
|
||||
- `LinkedList<T>::~LinkedList()` - Destructor. Clear Nodes to minimize memory. Does not free pointer memory.
|
||||
|
||||
- `int` `LinkedList<T>::size()` - Returns the current size of the list.
|
||||
|
||||
- `bool` `LinkedList<T>::add(T)` - Add element T at the END of the list.
|
||||
|
||||
- `bool` `LinkedList<T>::add(int index, T)` - Add element T at `index` of the list.
|
||||
|
||||
- `bool` `LinkedList<T>::unshift(T)` - Add element T at the BEGINNING of the list.
|
||||
|
||||
- `bool` `LinkedList<T>::set(int index, T)` - Set the element at `index` to T.
|
||||
|
||||
- `T` `LinkedList<T>::remove(int index)` - Remove element at `index`. Return the removed element. Does not free pointer memory
|
||||
|
||||
- `T` `LinkedList<T>::pop()` - Remove the LAST element. Return the removed element.
|
||||
|
||||
- `T` `LinkedList<T>::shift()` - Remove the FIRST element. Return the removed element.
|
||||
|
||||
- `T` `LinkedList<T>::get(int index)` - Return the element at `index`.
|
||||
|
||||
- `void` `LinkedList<T>::clear()` - Removes all elements. Does not free pointer memory.
|
||||
|
||||
- **protected** `int` `LinkedList<T>::_size` - Holds the cached size of the list.
|
||||
|
||||
- **protected** `ListNode<T>` `LinkedList<T>::*root` - Holds the root node of the list.
|
||||
|
||||
- **protected** `ListNode<T>` `LinkedList<T>::*last` - Holds the last node of the list.
|
||||
|
||||
- **protected** `ListNode<T>*` `LinkedList<T>::getNode(int index)` - Returns the `index` node of the list.
|
||||
|
||||
### Version History
|
||||
|
||||
* `1.1 (2013-07-20)`: Cache implemented. Getting subsequent objects is now O(N). Before, O(N^2).
|
||||
* `1.0 (2013-07-20)`: Original release
|
||||
|
||||

|
||||
@@ -0,0 +1,81 @@
|
||||
/*
|
||||
LinkedList Example
|
||||
Link: http://github.com/ivanseidel/LinkedList
|
||||
|
||||
Example Created by
|
||||
Tom Stewart, github.com/tastewar
|
||||
|
||||
Edited by:
|
||||
Ivan Seidel, github.com/ivanseidel
|
||||
*/
|
||||
|
||||
#include <LinkedList.h>
|
||||
|
||||
// Let's define a new class
|
||||
class Animal {
|
||||
public:
|
||||
char *name;
|
||||
bool isMammal;
|
||||
};
|
||||
|
||||
char catname[]="kitty";
|
||||
char dogname[]="doggie";
|
||||
char emuname[]="emu";
|
||||
|
||||
LinkedList<Animal*> myAnimalList = LinkedList<Animal*>();
|
||||
|
||||
void setup()
|
||||
{
|
||||
|
||||
Serial.begin(9600);
|
||||
Serial.println("Hello!" );
|
||||
|
||||
// Create a Cat
|
||||
Animal *cat = new Animal();
|
||||
cat->name = catname;
|
||||
cat->isMammal = true;
|
||||
|
||||
// Create a dog
|
||||
Animal *dog = new Animal();
|
||||
dog->name = dogname;
|
||||
dog->isMammal = true;
|
||||
|
||||
// Create a emu
|
||||
Animal *emu = new Animal();
|
||||
emu->name = emuname;
|
||||
emu->isMammal = false; // just an example; no offense to pig lovers
|
||||
|
||||
// Add animals to list
|
||||
myAnimalList.add(cat);
|
||||
myAnimalList.add(emu);
|
||||
myAnimalList.add(dog);
|
||||
}
|
||||
|
||||
void loop() {
|
||||
|
||||
Serial.print("There are ");
|
||||
Serial.print(myAnimalList.size());
|
||||
Serial.print(" animals in the list. The mammals are: ");
|
||||
|
||||
int current = 0;
|
||||
Animal *animal;
|
||||
for(int i = 0; i < myAnimalList.size(); i++){
|
||||
|
||||
// Get animal from list
|
||||
animal = myAnimalList.get(i);
|
||||
|
||||
// If its a mammal, then print it's name
|
||||
if(animal->isMammal){
|
||||
|
||||
// Avoid printing spacer on the first element
|
||||
if(current++)
|
||||
Serial.print(", ");
|
||||
|
||||
// Print animal name
|
||||
Serial.print(animal->name);
|
||||
}
|
||||
}
|
||||
Serial.println(".");
|
||||
|
||||
while (true); // nothing else to do, loop forever
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
/*
|
||||
LinkedList Example
|
||||
Link: http://github.com/ivanseidel/LinkedList
|
||||
|
||||
Example Created by
|
||||
Tom Stewart, github.com/tastewar
|
||||
|
||||
Edited by:
|
||||
Ivan Seidel, github.com/ivanseidel
|
||||
*/
|
||||
#include <LinkedList.h>
|
||||
|
||||
LinkedList<int> myList = LinkedList<int>();
|
||||
|
||||
void setup()
|
||||
{
|
||||
|
||||
Serial.begin(9600);
|
||||
Serial.println("Hello!");
|
||||
|
||||
// Add some stuff to the list
|
||||
int k = -240,
|
||||
l = 123,
|
||||
m = -2,
|
||||
n = 222;
|
||||
myList.add(n);
|
||||
myList.add(0);
|
||||
myList.add(l);
|
||||
myList.add(17);
|
||||
myList.add(k);
|
||||
myList.add(m);
|
||||
}
|
||||
|
||||
void loop() {
|
||||
|
||||
int listSize = myList.size();
|
||||
|
||||
Serial.print("There are ");
|
||||
Serial.print(listSize);
|
||||
Serial.print(" integers in the list. The negative ones are: ");
|
||||
|
||||
// Print Negative numbers
|
||||
for (int h = 0; h < listSize; h++) {
|
||||
|
||||
// Get value from list
|
||||
int val = myList.get(h);
|
||||
|
||||
// If the value is negative, print it
|
||||
if (val < 0) {
|
||||
Serial.print(" ");
|
||||
Serial.print(val);
|
||||
}
|
||||
}
|
||||
|
||||
while (true); // nothing else to do, loop forever
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
#######################################
|
||||
# Syntax Coloring
|
||||
#######################################
|
||||
|
||||
#######################################
|
||||
# Datatypes (KEYWORD1)
|
||||
#######################################
|
||||
|
||||
LinkedList KEYWORD1
|
||||
ListNode KEYWORD1
|
||||
|
||||
#######################################
|
||||
# Methods and Functions (KEYWORD2)
|
||||
#######################################
|
||||
|
||||
size KEYWORD2
|
||||
add KEYWORD2
|
||||
unshift KEYWORD2
|
||||
set KEYWORD2
|
||||
remove KEYWORD2
|
||||
pop KEYWORD2
|
||||
shift KEYWORD2
|
||||
get KEYWORD2
|
||||
clear KEYWORD2
|
||||
|
||||
#######################################
|
||||
# Constants (LITERAL1)
|
||||
#######################################
|
||||
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"name": "LinkedList",
|
||||
"keywords": "pattern",
|
||||
"description": "A fully implemented LinkedList (int, float, objects, Lists or Wales) made to work with Arduino projects",
|
||||
"repository":
|
||||
{
|
||||
"type": "git",
|
||||
"url": "https://github.com/ivanseidel/LinkedList.git"
|
||||
},
|
||||
"frameworks": "arduino",
|
||||
"platforms": "*"
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
name=LinkedList
|
||||
version=1.2.3
|
||||
author=Ivan Seidel <ivanseidel@gmail.com>
|
||||
maintainer=Ivan Seidel <ivanseidel@gmail.com>
|
||||
sentence=A fully implemented LinkedList made to work with Arduino projects
|
||||
paragraph=The objective of this library is to create a pattern for projects. If you need to use a List of: int, float, objects, Lists or Wales. This is what you are looking for.
|
||||
category=Data Processing
|
||||
url=https://github.com/ivanseidel/LinkedList
|
||||
architectures=*
|
||||
Reference in New Issue
Block a user