Move to gitHub the edn project (remove history keep it on my nas)
This commit is contained in:
29
Sources/tools/EdnTemplate/EdnTemplateTest.cpp
Normal file
29
Sources/tools/EdnTemplate/EdnTemplateTest.cpp
Normal file
@@ -0,0 +1,29 @@
|
||||
|
||||
#include "tools_debug.h"
|
||||
#include "tools_globals.h"
|
||||
|
||||
#include "EdnVectorBin.h"
|
||||
|
||||
void TestTemplate(void)
|
||||
{
|
||||
|
||||
EDN_WARNING("Start Template Test ...");
|
||||
EdnVectorBin<int32_t> plop;
|
||||
EdnVectorBin<int8_t> plop2;
|
||||
|
||||
plop.PushBack(15365);
|
||||
plop.PushBack(1);
|
||||
plop.PushBack(2);
|
||||
plop.PushBack(3);
|
||||
plop.PushBack(4);
|
||||
|
||||
EDN_INFO("data is : " << plop[0]);
|
||||
EDN_INFO("data is : " << plop[1]);
|
||||
EDN_INFO("data is : " << plop[2]);
|
||||
EDN_INFO("data is : " << plop[3]);
|
||||
|
||||
plop2.PushBack(65);
|
||||
|
||||
EDN_INFO("data is : " << plop2[0]);
|
||||
|
||||
}
|
186
Sources/tools/EdnTemplate/EdnTree.h
Normal file
186
Sources/tools/EdnTemplate/EdnTree.h
Normal file
@@ -0,0 +1,186 @@
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file EdnTree.h
|
||||
* @brief Editeur De N'ours : Basic tree in a vector For none expensive tree (template)
|
||||
* @author Edouard DUPIN
|
||||
* @date 04/04/2011
|
||||
* @par Project
|
||||
* Edn
|
||||
*
|
||||
* @par Copyright
|
||||
* Copyright 2010 Edouard DUPIN, all right reserved
|
||||
*
|
||||
* This software is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY.
|
||||
*
|
||||
* Licence summary :
|
||||
* You can modify and redistribute the sources code and binaries.
|
||||
* You can send me the bug-fix
|
||||
* You can not earn money with this Software (if the source extract from Edn
|
||||
* represent less than 50% of original Sources)
|
||||
* Term of the licence in in the file licence.txt.
|
||||
*
|
||||
*******************************************************************************
|
||||
*/
|
||||
#ifndef __EDN_TREE_H__
|
||||
#define __EDN_TREE_H__
|
||||
|
||||
#undef __class__
|
||||
#define __class__ "EdnTreeElement"
|
||||
|
||||
template < class T > class EdnTreeElement
|
||||
{
|
||||
public:
|
||||
EdnTreeElement(int32_t parent, int32_t id, T &maNouvelleClass) : elementPtr(NULL), m_parent(parent), m_id(id)
|
||||
{
|
||||
elementPtr = new T(maNouvelleClass);
|
||||
};
|
||||
~EdnTreeElement(void)
|
||||
{
|
||||
delete(elementPtr);
|
||||
};
|
||||
EdnTreeElement(const EdnTreeElement &mustCopy ) : elementPtr(NULL), m_parent(mustCopy.m_parent), m_id(mustCopy.m_id)
|
||||
{
|
||||
elementPtr = new T(*mustCopy.elementPtr);
|
||||
}
|
||||
int32_t GetParrent(void) { return m_parent;};
|
||||
int32_t GetId(void) { return m_id;};
|
||||
T* GetPtr() const
|
||||
{
|
||||
return elementPtr;
|
||||
};
|
||||
|
||||
private:
|
||||
T* elementPtr; // pointer on the curent element
|
||||
int32_t m_parent;
|
||||
int32_t m_id;
|
||||
};
|
||||
|
||||
#undef __class__
|
||||
#define __class__ "EdnTree"
|
||||
|
||||
#define ROOT_NODE_ID (-1)
|
||||
|
||||
template < class T > class EdnTree
|
||||
{
|
||||
public:
|
||||
// constructeur et destructeur
|
||||
EdnTree(void)
|
||||
{
|
||||
m_LastId = 0;
|
||||
};
|
||||
|
||||
~EdnTree(void)
|
||||
{
|
||||
|
||||
};
|
||||
// Common function ...
|
||||
int32_t GetNumberNode(void)
|
||||
{
|
||||
return m_listElement.size();
|
||||
};
|
||||
|
||||
int32_t GetDepth(void)
|
||||
{
|
||||
// TODO : ...
|
||||
return 0;
|
||||
};
|
||||
//!< add an element in the tree
|
||||
int32_t Add(T &maNouvelleClass, int32_t parent=-1)
|
||||
{
|
||||
if (true == CheckPresenceParrent(parent)) {
|
||||
// create the local element
|
||||
EdnTreeElement<T> nouvelElement(parent, m_LastId, maNouvelleClass);
|
||||
// add it in the list
|
||||
m_listElement.push_back(nouvelElement);
|
||||
// increment the ID of the element
|
||||
m_LastId++;
|
||||
// Add is Ok, in theory ...
|
||||
return m_LastId-1;
|
||||
}
|
||||
return -2;
|
||||
};
|
||||
|
||||
bool Remove(int32_t id)
|
||||
{
|
||||
return false;
|
||||
};
|
||||
|
||||
bool Clear(void)
|
||||
{
|
||||
return false;
|
||||
};
|
||||
|
||||
T* Get(int32_t id)
|
||||
{
|
||||
// try to find ID
|
||||
int32_t realID = FindElementWithId(id);
|
||||
// when we find it, check it
|
||||
if (0 > realID || realID >= m_LastId) {
|
||||
return NULL;
|
||||
}
|
||||
// Return the element :
|
||||
return m_listElement[realID].GetPtr();
|
||||
};
|
||||
|
||||
std::vector<int32_t> GetListSubNode( int32_t parentId = ROOT_NODE_ID)
|
||||
{
|
||||
std::vector<int32_t> res;
|
||||
int32_t i;
|
||||
for (i=0; i<(int32_t)m_listElement.size(); i++) {
|
||||
if (m_listElement[i].GetParrent() == parentId) {
|
||||
// Add the element ID in the list ...
|
||||
res.push_back(m_listElement[i].GetId());
|
||||
}
|
||||
}
|
||||
return res;
|
||||
};
|
||||
|
||||
std::vector<int32_t> Root(void)
|
||||
{
|
||||
return GetListSubNode(ROOT_NODE_ID);
|
||||
};
|
||||
|
||||
|
||||
private:
|
||||
int32_t m_LastId;
|
||||
std::vector< EdnTreeElement<T> > m_listElement; //!< list of element...
|
||||
|
||||
bool CheckPresence(int32_t id)
|
||||
{
|
||||
int32_t i;
|
||||
for (i=0; i<(int32_t)m_listElement.size(); i++) {
|
||||
if (m_listElement[i].GetId() == id) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
bool CheckPresenceParrent(int32_t parrentId)
|
||||
{
|
||||
if (ROOT_NODE_ID == parrentId) {
|
||||
return true;
|
||||
}
|
||||
return CheckPresence(parrentId);
|
||||
};
|
||||
|
||||
int32_t FindElementWithId(int32_t id)
|
||||
{
|
||||
int32_t i;
|
||||
for (i=0; i<(int32_t)m_listElement.size(); i++) {
|
||||
if (m_listElement[i].GetId() == id) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return ROOT_NODE_ID;
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
|
||||
#undef __class__
|
||||
#define __class__ NULL
|
||||
|
||||
#endif
|
||||
|
497
Sources/tools/EdnTemplate/EdnVector.h
Normal file
497
Sources/tools/EdnTemplate/EdnVector.h
Normal file
@@ -0,0 +1,497 @@
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file EdnEdnVector.h
|
||||
* @brief Editeur De N'ours : Basic EdnVector (template)
|
||||
* @author Edouard DUPIN
|
||||
* @date 07/04/2011
|
||||
* @par Project
|
||||
* Edn
|
||||
*
|
||||
* @par Copyright
|
||||
* Copyright 2010 Edouard DUPIN, all right reserved
|
||||
*
|
||||
* This software is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY.
|
||||
*
|
||||
* Licence summary :
|
||||
* You can modify and redistribute the sources code and binaries.
|
||||
* You can send me the bug-fix
|
||||
* You can not earn money with this Software (if the source extract from Edn
|
||||
* represent less than 50% of original Sources)
|
||||
* Term of the licence in in the file licence.txt.
|
||||
*
|
||||
*******************************************************************************
|
||||
*/
|
||||
#ifndef __EDN_EdnVector_H__
|
||||
#define __EDN_EdnVector_H__
|
||||
|
||||
#undef __class__
|
||||
#define __class__ "EdnEdnVector"
|
||||
|
||||
/**
|
||||
* @brief EdnVector classes ...
|
||||
*
|
||||
* @tparam[in] T The type of objects to store.
|
||||
* @tparam[in] INC Incrementation mode (0 : Exponential to 200 and increment by stemp of 200)
|
||||
*
|
||||
* @todo : Need to add : popBack / Assign / Insert / Erase / Swap / Clear
|
||||
*
|
||||
* m_data
|
||||
* ---------- |-----------------------|
|
||||
* | 0 |-------->| Class Data |
|
||||
* |--------| |-----------------------|
|
||||
* | 1 |----|
|
||||
* |--------| |
|
||||
* | 2 |====|==============| |-----------------------|
|
||||
* |--------| | --->| Class Data |
|
||||
* m_count | 3 |-| | |-----------------------|
|
||||
* |--------| | |
|
||||
* | x | | | |-----------------------|
|
||||
* |--------| | -------->| Class Data |
|
||||
* | x | | |-----------------------|
|
||||
* |--------| |
|
||||
* | x | |
|
||||
* |--------| | |-----------------------|
|
||||
* | x | --------------------->| Class Data |
|
||||
* |--------| |-----------------------|
|
||||
* | x |
|
||||
* |--------|
|
||||
* | x |
|
||||
* |--------|
|
||||
* m_size | x |
|
||||
* ----------
|
||||
*
|
||||
*/
|
||||
template<class T, int32_t INC=0> class EdnVector:
|
||||
{
|
||||
public:
|
||||
class Iterator:
|
||||
{
|
||||
// Private data :
|
||||
private:
|
||||
int32_t m_current; // curent Id on the vector
|
||||
EdnVector<T> * m_EdnVector; // Pointer on the curent element of the vector
|
||||
public:
|
||||
/**
|
||||
* @brief Basic itarator constructor with no link with an EdnVector
|
||||
*/
|
||||
Iterator():
|
||||
m_current(-1),
|
||||
m_EdnVector(NULL)
|
||||
{
|
||||
// nothing to do ...
|
||||
}
|
||||
/**
|
||||
* @brief Recopy constructor on a specific EdnVector.
|
||||
* @param[in] otherIterator The Iterator that might be copy
|
||||
*/
|
||||
Iterator(const Iterator & otherIterator):
|
||||
m_current(otherIterator.m_current),
|
||||
m_EdnVector(otherIterator.m_EdnVector)
|
||||
{
|
||||
// nothing to do ...
|
||||
}
|
||||
/**
|
||||
* @brief Asignation operator.
|
||||
* @param[in] otherIterator The Iterator that might be copy
|
||||
* @return reference on the curent Iterator
|
||||
*/
|
||||
Iterator& operator=(const Iterator & otherIterator)
|
||||
{
|
||||
m_current = otherIterator.m_current;
|
||||
m_EdnVector = otherIterator.m_EdnVector;
|
||||
return *this;
|
||||
}
|
||||
/**
|
||||
* @brief Basic destructor
|
||||
*/
|
||||
~Iterator()
|
||||
{
|
||||
m_current = -1;
|
||||
m_EdnVector = NULL;
|
||||
}
|
||||
/**
|
||||
* @brief basic boolean cast
|
||||
* @return true if the element is present in the EdnVector size
|
||||
*/
|
||||
operator bool ()
|
||||
{
|
||||
if( 0 <= m_current
|
||||
&& m_current < m_EdnVector->Size() )
|
||||
{
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* @brief Incremental operator
|
||||
* @return Reference on the current iterator incremented
|
||||
*/
|
||||
Iterator& operator++ ()
|
||||
{
|
||||
if( NULL != m_EdnVector
|
||||
&& m_current < m_EdnVector->Size() )
|
||||
{
|
||||
m_current++;
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
/**
|
||||
* @brief Decremental operator
|
||||
* @return Reference on the current iterator decremented
|
||||
*/
|
||||
Iterator& operator-- ()
|
||||
{
|
||||
if (m_current >= 0) {
|
||||
m_current--;
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
/**
|
||||
* @brief Incremental operator
|
||||
* @return Reference on a new iterator and increment the other one
|
||||
*/
|
||||
Iterator operator++ (int32_t)
|
||||
{
|
||||
Iterator it(*this);
|
||||
++(*this);
|
||||
return it;
|
||||
}
|
||||
/**
|
||||
* @brief Decremental operator
|
||||
* @return Reference on a new iterator and decrement the other one
|
||||
*
|
||||
*/
|
||||
Iterator operator-- (int32_t)
|
||||
{
|
||||
Iterator it(*this);
|
||||
--(*this);
|
||||
return it;
|
||||
}
|
||||
/**
|
||||
* @brief
|
||||
*
|
||||
* @param[in,out] ---
|
||||
*
|
||||
* @return ---
|
||||
*
|
||||
*/
|
||||
T * operator-> () const
|
||||
{
|
||||
EDN_CHECK_INOUT(m_current >= 0 && m_current < m_EdnVector->Size());
|
||||
return &m_EdnVector->Get(m_current);
|
||||
}
|
||||
/**
|
||||
* @brief
|
||||
*
|
||||
* @param[in,out] ---
|
||||
*
|
||||
* @return ---
|
||||
*
|
||||
*/
|
||||
T & operator* () const
|
||||
{
|
||||
EDN_CHECK_INOUT(m_current >= 0 && m_current < m_EdnVector->Size());
|
||||
return m_EdnVector->Get(m_current);
|
||||
}
|
||||
private:
|
||||
/**
|
||||
* @brief
|
||||
*
|
||||
* @param[in,out] ---
|
||||
*
|
||||
* @return ---
|
||||
*
|
||||
*/
|
||||
Iterator(EdnVector<T> * EdnVector, int pos):
|
||||
m_current(pos),
|
||||
m_EdnVector(EdnVector)
|
||||
{
|
||||
// nothing to do ...
|
||||
}
|
||||
friend class EdnVector;
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief
|
||||
*
|
||||
* @param[in,out] ---
|
||||
*
|
||||
* @return ---
|
||||
*
|
||||
*/
|
||||
EdnVector(int count = 0):
|
||||
m_data(NULL),
|
||||
m_count(0),
|
||||
m_size(0)
|
||||
{
|
||||
Resize(count);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief
|
||||
*
|
||||
* @param[in,out] ---
|
||||
*
|
||||
* @return ---
|
||||
*
|
||||
*/
|
||||
EdnVector(const EdnVector<T> & EdnVector):
|
||||
m_size(EdnVector.m_size),
|
||||
m_count(EdnVector.m_count),
|
||||
m_data(NULL)
|
||||
{
|
||||
int32_t i;
|
||||
EDN_MALLOC_CAST(m_data, m_size, T, reinterpret_cast<T*>);
|
||||
for(i=0; i<m_count; i++) {
|
||||
new (&m_data[i]) T(EdnVector[i]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief
|
||||
*
|
||||
* @param[in,out] ---
|
||||
*
|
||||
* @return ---
|
||||
*
|
||||
*/
|
||||
~EdnVector()
|
||||
{
|
||||
Destroy();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief
|
||||
*
|
||||
* @param[in,out] ---
|
||||
*
|
||||
* @return ---
|
||||
*
|
||||
*/
|
||||
EdnVector& operator=(const EdnVector<T> & EdnVector)
|
||||
{
|
||||
int32_t i;
|
||||
this->~EdnVector();
|
||||
m_size = EdnVector.m_size;
|
||||
m_count = EdnVector.m_count;
|
||||
EDN_MALLOC_CAST(m_data, m_size, T, reinterpret_cast<T*>);
|
||||
for(i=0; i<m_count; i++) {
|
||||
new (&m_data[i]) T(EdnVector[i]);
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief
|
||||
*
|
||||
* @param[in,out] ---
|
||||
*
|
||||
* @return ---
|
||||
*
|
||||
*/
|
||||
int32_t Size()
|
||||
{
|
||||
return m_count;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief
|
||||
*
|
||||
* @param[in,out] ---
|
||||
*
|
||||
* @return ---
|
||||
*
|
||||
*/
|
||||
T& Get(int32_t pos)
|
||||
{
|
||||
return m_data[pos];
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief
|
||||
*
|
||||
* @param[in,out] ---
|
||||
*
|
||||
* @return ---
|
||||
*
|
||||
*/
|
||||
T& operator[] (int32_t pos)
|
||||
{
|
||||
return Get(pos);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief
|
||||
*
|
||||
* @param[in,out] ---
|
||||
*
|
||||
* @return ---
|
||||
*
|
||||
*/
|
||||
const T& operator[] (int32_t pos) const
|
||||
{
|
||||
return m_data[pos];
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief
|
||||
*
|
||||
* @param[in,out] ---
|
||||
*
|
||||
* @return ---
|
||||
*
|
||||
*/
|
||||
int IndexOf(const T * item) const
|
||||
{
|
||||
int32_t res = item - m_data;
|
||||
if( 0 > res
|
||||
|| res >= Size())
|
||||
{
|
||||
return -1
|
||||
} else {
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief
|
||||
*
|
||||
* @param[in,out] ---
|
||||
*
|
||||
* @return ---
|
||||
*
|
||||
*/
|
||||
void PushBack(const T& item)
|
||||
{
|
||||
int32_t idx = Size();
|
||||
Resize(idx+1);
|
||||
Get(idx) = item;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief
|
||||
*
|
||||
* @param[in,out] ---
|
||||
*
|
||||
* @return ---
|
||||
*
|
||||
*/
|
||||
Iterator Get(int pos)
|
||||
{
|
||||
return Iterator(this, pos);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief
|
||||
*
|
||||
* @param[in,out] ---
|
||||
*
|
||||
* @return ---
|
||||
*
|
||||
*/
|
||||
Iterator Begin()
|
||||
{
|
||||
return Get(0);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief
|
||||
*
|
||||
* @param[in,out] ---
|
||||
*
|
||||
* @return ---
|
||||
*
|
||||
*/
|
||||
Iterator End()
|
||||
{
|
||||
return Get( Size()-1 );
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief
|
||||
*
|
||||
* @param[in,out] ---
|
||||
*
|
||||
* @return ---
|
||||
*
|
||||
*/
|
||||
void Resize(int32_t count)
|
||||
{
|
||||
int32_t i;
|
||||
// Reallocate memory
|
||||
if (count > m_size) {
|
||||
ChangeAllocation(count);
|
||||
}
|
||||
|
||||
// Remove deprecated element
|
||||
for(i=count; i<m_count; i++) {
|
||||
m_data[i].~T();
|
||||
}
|
||||
|
||||
// Create nex item
|
||||
for(i=m_count;i<count;i++) {
|
||||
new (&m_data[i]) T();
|
||||
}
|
||||
|
||||
m_count = count;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief
|
||||
*
|
||||
* @param[in,out] ---
|
||||
*
|
||||
* @return ---
|
||||
*
|
||||
*/
|
||||
void ChangeAllocation(int count)
|
||||
{
|
||||
if (count > m_size) {
|
||||
// generate new size
|
||||
while(count > m_size) {
|
||||
if (INC) {
|
||||
m_size = (m_size + INC)
|
||||
} else if (m_size==0) {
|
||||
m_size = 1;
|
||||
} else {
|
||||
m_size = m_size * 2;
|
||||
}
|
||||
}
|
||||
// Allocate the curent element
|
||||
T * data = NULL;
|
||||
EDN_MALLOC_CAST(data, m_size, T, reinterpret_cast<T*>);
|
||||
for(int i=0; i<m_count; i++) {
|
||||
new (&data[i]) T(m_data[i]);
|
||||
}
|
||||
Destroy();
|
||||
m_data = data;
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
T * m_data; //!< pointer on the current Data
|
||||
int32_t m_count; //!< number of element
|
||||
int32_t m_size; //!< current allocated size
|
||||
|
||||
/**
|
||||
* @brief
|
||||
*
|
||||
* @param[in,out] ---
|
||||
*
|
||||
* @return ---
|
||||
*
|
||||
*/
|
||||
void Destroy()
|
||||
{
|
||||
for(int i=0; i<m_count; i++) {
|
||||
m_data[i].~T();
|
||||
}
|
||||
if (m_data) {
|
||||
EDN_FREE(m_data);
|
||||
}
|
||||
}
|
||||
};
|
||||
#undef __class__
|
||||
#define __class__ NULL
|
642
Sources/tools/EdnTemplate/EdnVectorBin.h
Normal file
642
Sources/tools/EdnTemplate/EdnVectorBin.h
Normal file
@@ -0,0 +1,642 @@
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file EdnEdnVectorBin.h
|
||||
* @brief Editeur De N'ours : Basic EdnVectorBin for direct data insertion (template)
|
||||
* @author Edouard DUPIN
|
||||
* @date 07/04/2011
|
||||
* @par Project
|
||||
* Edn
|
||||
*
|
||||
* @par Copyright
|
||||
* Copyright 2010 Edouard DUPIN, all right reserved
|
||||
*
|
||||
* This software is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY.
|
||||
*
|
||||
* Licence summary :
|
||||
* You can modify and redistribute the sources code and binaries.
|
||||
* You can send me the bug-fix
|
||||
* You can not earn money with this Software (if the source extract from Edn
|
||||
* represent less than 50% of original Sources)
|
||||
* Term of the licence in in the file licence.txt.
|
||||
*
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef __EDN_VECTOR_BIN_H__
|
||||
#define __EDN_VECTOR_BIN_H__
|
||||
|
||||
#include "toolsMemory.h"
|
||||
|
||||
#undef __class__
|
||||
#define __class__ "EdnEdnVectorBin"
|
||||
|
||||
/**
|
||||
* @brief EdnVectorBin classes ...
|
||||
*
|
||||
* @tparam[in] SIZE Size of the current element.
|
||||
*
|
||||
* @todo : Need to add : popBack / Assign / Insert / Erase / Swap / Clear
|
||||
*
|
||||
* m_data
|
||||
* <------------ m_dataSize ------------>
|
||||
* ----------------------------------------
|
||||
* | 0 |
|
||||
* |--------------------------------------|
|
||||
* | 1 |
|
||||
* |--------------------------------------|
|
||||
* | 2 |
|
||||
* |--------------------------------------|
|
||||
* m_size | 3 |
|
||||
* |--------------------------------------|
|
||||
* | x |
|
||||
* |--------------------------------------|
|
||||
* | x |
|
||||
* |--------------------------------------|
|
||||
* | x |
|
||||
* |--------------------------------------|
|
||||
* | x |
|
||||
* |--------------------------------------|
|
||||
* | x |
|
||||
* |--------------------------------------|
|
||||
* | x |
|
||||
* |--------------------------------------|
|
||||
* m_allocated | x |
|
||||
* ----------------------------------------
|
||||
*
|
||||
*/
|
||||
template<typename MY_TYPE=int32_t> class EdnVectorBin
|
||||
{
|
||||
public:
|
||||
class Iterator
|
||||
{
|
||||
// Private data :
|
||||
private:
|
||||
int32_t m_current; // curent Id on the vector
|
||||
EdnVectorBin<MY_TYPE> * m_EdnVectorBin; // Pointer on the curent element of the vectorBin
|
||||
public:
|
||||
/**
|
||||
* @brief Basic itarator constructor with no link with an EdnVector
|
||||
*/
|
||||
Iterator():
|
||||
m_current(-1),
|
||||
m_EdnVectorBin(NULL)
|
||||
{
|
||||
// nothing to do ...
|
||||
}
|
||||
/**
|
||||
* @brief Recopy constructor on a specific EdnVector.
|
||||
* @param[in] otherIterator The Iterator that might be copy
|
||||
*/
|
||||
Iterator(const Iterator & otherIterator):
|
||||
m_current(otherIterator.m_current),
|
||||
m_EdnVectorBin(otherIterator.m_EdnVectorBin)
|
||||
{
|
||||
// nothing to do ...
|
||||
}
|
||||
/**
|
||||
* @brief Asignation operator.
|
||||
* @param[in] otherIterator The Iterator that might be copy
|
||||
* @return reference on the curent Iterator
|
||||
*/
|
||||
Iterator& operator=(const Iterator & otherIterator)
|
||||
{
|
||||
m_current = otherIterator.m_current;
|
||||
m_EdnVectorBin = otherIterator.m_EdnVectorBin;
|
||||
return *this;
|
||||
}
|
||||
/**
|
||||
* @brief Basic destructor
|
||||
*/
|
||||
~Iterator()
|
||||
{
|
||||
m_current = -1;
|
||||
m_EdnVectorBin = NULL;
|
||||
}
|
||||
/**
|
||||
* @brief basic boolean cast
|
||||
* @return true if the element is present in the EdnVector size
|
||||
*/
|
||||
operator bool ()
|
||||
{
|
||||
if( 0 <= m_current
|
||||
&& m_current < m_EdnVectorBin->Size() )
|
||||
{
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* @brief Incremental operator
|
||||
* @return Reference on the current iterator incremented
|
||||
*/
|
||||
Iterator& operator++ ()
|
||||
{
|
||||
if( NULL != m_EdnVectorBin
|
||||
&& m_current < m_EdnVectorBin->Size() )
|
||||
{
|
||||
m_current++;
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
/**
|
||||
* @brief Decremental operator
|
||||
* @return Reference on the current iterator decremented
|
||||
*/
|
||||
Iterator& operator-- ()
|
||||
{
|
||||
if (m_current >= 0) {
|
||||
m_current--;
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
/**
|
||||
* @brief Incremental operator
|
||||
* @return Reference on a new iterator and increment the other one
|
||||
*/
|
||||
Iterator operator++ (int32_t)
|
||||
{
|
||||
Iterator it(*this);
|
||||
++(*this);
|
||||
return it;
|
||||
}
|
||||
/**
|
||||
* @brief Decremental operator
|
||||
* @return Reference on a new iterator and decrement the other one
|
||||
*/
|
||||
Iterator operator-- (int32_t)
|
||||
{
|
||||
Iterator it(*this);
|
||||
--(*this);
|
||||
return it;
|
||||
}
|
||||
/**
|
||||
* @brief Get reference on the current Element
|
||||
* @return the reference on the current Element
|
||||
*/
|
||||
MY_TYPE & operator-> () const
|
||||
{
|
||||
EDN_CHECK_INOUT(m_current >= 0 && m_current < m_EdnVectorBin->Size());
|
||||
return &m_EdnVectorBin->Get(m_current);
|
||||
}
|
||||
/**
|
||||
* @brief Get reference on the current Element
|
||||
* @return the reference on the current Element
|
||||
*/
|
||||
MY_TYPE & operator* () const
|
||||
{
|
||||
EDN_CHECK_INOUT(m_current >= 0 && m_current < m_EdnVectorBin->Size());
|
||||
return m_EdnVectorBin->Get(m_current);
|
||||
}
|
||||
private:
|
||||
/**
|
||||
* @brief
|
||||
*
|
||||
* @param[in,out] ---
|
||||
*
|
||||
* @return ---
|
||||
*
|
||||
*/
|
||||
Iterator(EdnVectorBin<MY_TYPE> * Evb, int32_t pos):
|
||||
m_current(pos),
|
||||
m_EdnVectorBin(Evb)
|
||||
{
|
||||
// nothing to do ...
|
||||
}
|
||||
friend class EdnVectorBin;
|
||||
};
|
||||
|
||||
private:
|
||||
MY_TYPE * m_data; //!< pointer on the curetn table of Data
|
||||
int32_t m_size; //!< nb Element in the buffer
|
||||
int32_t m_allocated; //!< Current allocated size
|
||||
int32_t m_increment; //!< methode of increment
|
||||
public:
|
||||
/**
|
||||
* @brief Create an empty vector
|
||||
* @param[in] count Minimum request size of the Buffer
|
||||
*/
|
||||
EdnVectorBin(int32_t count = 0):
|
||||
m_data(NULL),
|
||||
m_size(0),
|
||||
m_allocated(0),
|
||||
m_increment(1)
|
||||
{
|
||||
ChangeAllocation(count);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Re-copy constructor (copy all needed data)
|
||||
* @param[in] Evb Vector that might be copy
|
||||
*/
|
||||
EdnVectorBin(const EdnVectorBin<MY_TYPE> & Evb)
|
||||
{
|
||||
m_allocated = Evb.m_allocated;
|
||||
m_size = Evb.m_size;
|
||||
m_increment = Evb.m_increment;
|
||||
m_data = NULL;
|
||||
//EDN_DEBUG("USE Specific vector allocator ... Evb.m_size=" << Evb.m_size << " Evb.m_increment=" << Evb.m_increment);
|
||||
// allocate all same data
|
||||
EDN_MALLOC(m_data, m_allocated, MY_TYPE);
|
||||
EDN_ASSERT(NULL!=m_data, "Error in data allocation");
|
||||
// Copy all data ...
|
||||
memcpy(m_data, Evb.m_data, m_allocated * sizeof(MY_TYPE) );
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Destructor of the current Class
|
||||
*/
|
||||
~EdnVectorBin()
|
||||
{
|
||||
if (NULL!=m_data) {
|
||||
EDN_FREE(m_data);
|
||||
m_data = NULL;
|
||||
m_allocated = 0;
|
||||
m_size = 0;
|
||||
m_increment = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Re-copy operator
|
||||
* @param[in] Evb Vector that might be copy
|
||||
* @return reference on the curent re-copy vector
|
||||
*/
|
||||
EdnVectorBin& operator=(const EdnVectorBin<MY_TYPE> & Evb)
|
||||
{
|
||||
//EDN_DEBUG("USE RECOPY vector ... Evb.m_size=" << Evb.m_size << " Evb.m_increment=" << Evb.m_increment);
|
||||
if( this != &Evb ) // avoid copy to itself
|
||||
{
|
||||
if (NULL!=m_data) {
|
||||
EDN_FREE(m_data);
|
||||
m_data = NULL;
|
||||
}
|
||||
// Set the new value
|
||||
m_allocated = Evb.m_allocated;
|
||||
m_size = Evb.m_size;
|
||||
m_increment = Evb.m_increment;
|
||||
// allocate all same data
|
||||
EDN_MALLOC(m_data, m_allocated, MY_TYPE);
|
||||
EDN_ASSERT(NULL!=m_data, "Error in data allocation");
|
||||
// Copy all data ...
|
||||
memcpy(m_data, Evb.m_data, m_allocated * sizeof(MY_TYPE) );
|
||||
}
|
||||
// Return the curent pointer
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Add at the Last position of the Vector
|
||||
* @param[in] item Element to add at the end of vector
|
||||
*/
|
||||
EdnVectorBin& operator+= (const EdnVectorBin<MY_TYPE> & Evb) // += operator
|
||||
{
|
||||
int32_t nbElememt = Evb.Size();
|
||||
int32_t idx = m_size;
|
||||
Resize(m_size+nbElememt);
|
||||
memcpy(&m_data[idx], &Evb.m_data[0], nbElememt*sizeof(MY_TYPE) );
|
||||
// Return the curent pointer
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Set increment mode of this vector (default it match corectly with the number of element inside)
|
||||
* @param[in] newIncrementNumber methode requested
|
||||
*/
|
||||
void SetIncrement(int32_t newIncrementNumber)
|
||||
{
|
||||
m_increment = newIncrementNumber;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get the number of element in the vector
|
||||
* @return The number requested
|
||||
*/
|
||||
int32_t Size() const
|
||||
{
|
||||
return m_size;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get the Allocated size in the vector
|
||||
* @return The size of allocation
|
||||
*/
|
||||
int32_t AllocatedSize() const
|
||||
{
|
||||
return m_allocated;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get a current element in the vector
|
||||
* @param[in] pos Desired position read
|
||||
* @return Reference on the Element
|
||||
*/
|
||||
MY_TYPE& Get(int32_t pos)
|
||||
{
|
||||
return m_data[pos];
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get an copy Element an a special position
|
||||
* @param[in] pos Position in the vector that might be get [0..Size()]
|
||||
* @return An reference on the copy of selected element
|
||||
*/
|
||||
MY_TYPE& operator[] (int32_t pos)
|
||||
{
|
||||
return Get(pos);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get an Element an a special position
|
||||
* @param[in] pos Position in the vector that might be get [0..Size()]
|
||||
* @return An reference on the selected element
|
||||
*/
|
||||
const MY_TYPE& operator[] (int32_t pos) const
|
||||
{
|
||||
return m_data[pos];
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Add at the Last position of the Vector
|
||||
* @param[in] item Element to add at the end of vector
|
||||
*/
|
||||
void PushBack(const MY_TYPE& item)
|
||||
{
|
||||
int32_t idx = m_size;
|
||||
Resize(m_size+1);
|
||||
m_data[idx] = item;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Add at the Last position of the Vector
|
||||
* @param[in] item Element to add at the end of vector
|
||||
*/
|
||||
void PushBack(const MY_TYPE * item, int32_t nbElement)
|
||||
{
|
||||
if (NULL == item) {
|
||||
return;
|
||||
}
|
||||
int32_t idx = m_size;
|
||||
Resize(m_size+nbElement);
|
||||
memcpy(&m_data[idx], item, nbElement*sizeof(MY_TYPE) );
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Remove the last element of the vector
|
||||
*/
|
||||
void PopBack(void)
|
||||
{
|
||||
if(m_size>0) {
|
||||
Resize(m_size-1);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Remove all alement in the current vector
|
||||
*/
|
||||
void Clear(void)
|
||||
{
|
||||
if(m_size>0) {
|
||||
Resize(0);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief
|
||||
*
|
||||
* @param[in,out] ---
|
||||
*
|
||||
* @return ---
|
||||
*
|
||||
*/
|
||||
void Insert(int32_t pos, const MY_TYPE& item)
|
||||
{
|
||||
if (pos>m_size) {
|
||||
EDN_ERROR(" can not insert Element at this position : " << pos << " > " << m_size<< " add it at the end ... ");
|
||||
PushBack(item);
|
||||
return;
|
||||
}
|
||||
int32_t tmpSize = m_size;
|
||||
// Request resize of the current buffer
|
||||
Resize(m_size+1);
|
||||
// move curent data
|
||||
memmove((m_data + pos + 1), (m_data + pos), (tmpSize - pos)*sizeof(MY_TYPE) );
|
||||
// affectation of the current element
|
||||
m_data[pos] = item;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief
|
||||
*
|
||||
* @param[in,out] ---
|
||||
*
|
||||
* @return ---
|
||||
*
|
||||
*/
|
||||
void Insert(int32_t pos, const MY_TYPE * item, int32_t nbElement)
|
||||
{
|
||||
if (pos>m_size) {
|
||||
EDN_WARNING(" can not insert Element at this position : " << pos << " > " << m_size << " add it at the end ... ");
|
||||
PushBack(item, nbElement);
|
||||
return;
|
||||
}
|
||||
int32_t tmpSize = m_size;
|
||||
// Request resize of the current buffer
|
||||
Resize(m_size+nbElement);
|
||||
// move curent data (after the position)
|
||||
memmove((m_data + pos + nbElement), (m_data + pos), (tmpSize - pos)*sizeof(MY_TYPE) );
|
||||
// affectation of all input element
|
||||
memcpy(&m_data[pos], item, nbElement*sizeof(MY_TYPE) );
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Remove one element
|
||||
*
|
||||
* @param[in] pos Position to remove the data
|
||||
*
|
||||
* @return ---
|
||||
*
|
||||
*/
|
||||
void Erase(int32_t pos)
|
||||
{
|
||||
if (pos>m_size) {
|
||||
EDN_ERROR(" can not Erase Element at this position : " << pos << " > " << m_size);
|
||||
return;
|
||||
}
|
||||
int32_t tmpSize = m_size;
|
||||
// move curent data
|
||||
memmove((m_data + pos), (m_data + pos + 1), (tmpSize - (pos+1))*sizeof(MY_TYPE) );
|
||||
// Request resize of the current buffer
|
||||
Resize(m_size-1);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Remove one element
|
||||
*
|
||||
* @param[in] pos Position to remove the data
|
||||
* @param[in] nbElement number of element to remove
|
||||
*
|
||||
* @return ---
|
||||
*
|
||||
*/
|
||||
void Erase(int32_t pos, int32_t nbElement)
|
||||
{
|
||||
if (pos>m_size) {
|
||||
EDN_ERROR(" can not Erase Element at this position : " << pos << " > " << m_size);
|
||||
return;
|
||||
}
|
||||
if (pos+nbElement>m_size) {
|
||||
nbElement = m_size - pos;
|
||||
}
|
||||
int32_t tmpSize = m_size;
|
||||
// move curent data
|
||||
memmove((m_data + pos), (m_data + pos + nbElement), (tmpSize - (pos+nbElement))*sizeof(MY_TYPE) );
|
||||
// Request resize of the current buffer
|
||||
Resize(m_size-nbElement);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief extract data between two point :
|
||||
* @param[in] posStart start position to extract data
|
||||
* @param[in] posEnd End position to extract data
|
||||
* @return the extracted vector
|
||||
*/
|
||||
EdnVectorBin Extract(int32_t posStart = 0, int32_t posEnd=0x7FFFFFFF)
|
||||
{
|
||||
EdnVectorBin<MY_TYPE> out;
|
||||
if (posStart < 0) {
|
||||
posStart = 0;
|
||||
} else if (posStart >= Size() ) {
|
||||
return out;
|
||||
}
|
||||
if (posEnd < 0) {
|
||||
return out;
|
||||
} else if (posEnd >= Size() ) {
|
||||
posEnd = Size();
|
||||
}
|
||||
out.PushBack(&m_data[posStart], posEnd-posStart);
|
||||
return out;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Set the minimum allocation in memory for the curent vector ==> reallocate the
|
||||
* buffer to fit exactly the mumber of element needed
|
||||
*/
|
||||
void Fit(void)
|
||||
{
|
||||
if (m_size > m_allocated) {
|
||||
// Reallocate the curent data to the correct size ...
|
||||
EDN_REALLOC(m_data, m_size, MY_TYPE);
|
||||
}
|
||||
// Check result with assert :
|
||||
EDN_ASSERT(NULL!=m_data, "Error in data Fitting");
|
||||
m_allocated = m_size;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get an iterator an an specific position
|
||||
* @param[in] pos Requested position of the iterator in the vector
|
||||
* @return The Iterator
|
||||
*/
|
||||
Iterator Position(int32_t pos)
|
||||
{
|
||||
return Iterator(this, pos);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get an Iterator on the start position of the Vector
|
||||
* @return The Iterator
|
||||
*/
|
||||
Iterator Begin(void)
|
||||
{
|
||||
return Position(0);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get an Iterator on the end position of the Vector
|
||||
* @return The Iterator
|
||||
*/
|
||||
Iterator End(void)
|
||||
{
|
||||
return Position( Size()-1 );
|
||||
}
|
||||
|
||||
private:
|
||||
/**
|
||||
* @brief Change the current size of the vector
|
||||
* @param[in] newSize New requested size of element in the vector
|
||||
*/
|
||||
void Resize(int32_t newSize)
|
||||
{
|
||||
// Reallocate memory
|
||||
if (newSize > m_allocated) {
|
||||
ChangeAllocation(newSize);
|
||||
}
|
||||
m_size = newSize;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Change the current allocation to the corect one (depend on the current size)
|
||||
* @param[in] newSize Minimum number of element needed
|
||||
*/
|
||||
void ChangeAllocation(int32_t newSize)
|
||||
{
|
||||
// set the minimal size to 1
|
||||
if(newSize <= 0) {
|
||||
newSize = 1;
|
||||
}
|
||||
int32_t requestSize = m_allocated;
|
||||
// set the size with the corect chose type :
|
||||
if (newSize == m_allocated) {
|
||||
return;
|
||||
} else if (newSize < requestSize) {
|
||||
// down the size of the vector:
|
||||
if (0==m_increment) {
|
||||
// never down size...
|
||||
} else {
|
||||
int32_t devide = m_increment;
|
||||
if (devide == 0) {
|
||||
devide = 1;
|
||||
}
|
||||
int32_t numberOfStep = m_allocated / devide;
|
||||
if (newSize< ((numberOfStep-2)*devide + devide/2) ) {
|
||||
//Allow Reallocation of a new size shoerter
|
||||
requestSize = ((newSize / devide)+1) * devide;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
while(newSize > requestSize) {
|
||||
if (0 == requestSize) {
|
||||
requestSize = 1;
|
||||
} else if (0==m_increment) {
|
||||
requestSize = requestSize * 2;
|
||||
} else {
|
||||
requestSize = (requestSize + m_increment);
|
||||
}
|
||||
}
|
||||
}
|
||||
// No reallocation needed :
|
||||
if (requestSize == m_allocated) {
|
||||
return;
|
||||
}
|
||||
// check if something is allocated :
|
||||
if (NULL == m_data) {
|
||||
// no data allocated ==> request an allocation (might be the first)
|
||||
EDN_MALLOC(m_data, requestSize, MY_TYPE);
|
||||
} else {
|
||||
// move datas
|
||||
EDN_REALLOC(m_data, requestSize, MY_TYPE);
|
||||
}
|
||||
// Check result with assert :
|
||||
EDN_ASSERT(NULL!=m_data, "Error in data allocation");
|
||||
// set the new allocation size
|
||||
m_allocated = requestSize;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
#undef __class__
|
||||
#define __class__ NULL
|
||||
|
||||
#endif
|
706
Sources/tools/EdnTemplate/EdnVectorBuf.cpp
Normal file
706
Sources/tools/EdnTemplate/EdnVectorBuf.cpp
Normal file
@@ -0,0 +1,706 @@
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file EdnEdnVectorBuf.cpp
|
||||
* @brief Editeur De N'ours : Basic EdnVectorBuf Basic binary vector for all type of storage
|
||||
* @author Edouard DUPIN
|
||||
* @date 07/04/2011
|
||||
* @par Project
|
||||
* Edn
|
||||
*
|
||||
* @par Copyright
|
||||
* Copyright 2010 Edouard DUPIN, all right reserved
|
||||
*
|
||||
* This software is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY.
|
||||
*
|
||||
* Licence summary :
|
||||
* You can modify and redistribute the sources code and binaries.
|
||||
* You can send me the bug-fix
|
||||
* You can not earn money with this Software (if the source extract from Edn
|
||||
* represent less than 50% of original Sources)
|
||||
* Term of the licence in in the file licence.txt.
|
||||
*
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
#include "tools_debug.h"
|
||||
#include "tools_globals.h"
|
||||
#include "toolsMemory.h"
|
||||
#include "EdnVectorBuf.h"
|
||||
|
||||
#undef __class__
|
||||
#define __class__ "EdnEdnVectorBuf"
|
||||
|
||||
|
||||
/**
|
||||
* @brief Create an empty vector
|
||||
*
|
||||
* @param[in] count Minimum request size of the Buffer
|
||||
*
|
||||
* @return ---
|
||||
*
|
||||
*/
|
||||
EdnVectorBuf::EdnVectorBuf(int32_t count)
|
||||
{
|
||||
m_data = NULL;
|
||||
m_allocated = 0;
|
||||
m_gapStart = 0;
|
||||
m_gapEnd = GAP_SIZE_MIN;
|
||||
ChangeAllocation(count+GAP_SIZE_MIN);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Re-copy constructor (copy all needed data)
|
||||
*
|
||||
* @param[in] Evb Vector that might be copy
|
||||
*
|
||||
* @return ---
|
||||
*
|
||||
*/
|
||||
EdnVectorBuf::EdnVectorBuf(const EdnVectorBuf & Evb)
|
||||
{
|
||||
m_allocated = Evb.m_allocated;
|
||||
m_data = NULL;
|
||||
m_gapStart = Evb.m_gapStart;
|
||||
m_gapEnd = Evb.m_gapEnd;
|
||||
|
||||
// allocate all same data
|
||||
EDN_MALLOC(m_data, m_allocated, int8_t);
|
||||
EDN_ASSERT(NULL!=m_data, "Error in data allocation");
|
||||
// Copy all data ...
|
||||
memcpy(m_data, Evb.m_data, m_allocated * sizeof(int8_t) );
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Destructor of the current Class
|
||||
*
|
||||
* @param ---
|
||||
*
|
||||
* @return ---
|
||||
*
|
||||
*/
|
||||
EdnVectorBuf::~EdnVectorBuf()
|
||||
{
|
||||
if (NULL!=m_data) {
|
||||
EDN_FREE(m_data);
|
||||
m_data = NULL;
|
||||
m_allocated = 0;
|
||||
m_gapStart = 0;
|
||||
m_gapEnd = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static int32_t getFileSize(FILE *myFile)
|
||||
{
|
||||
if (NULL == myFile) {
|
||||
return 0;
|
||||
}
|
||||
int32_t size = 0;
|
||||
|
||||
fseek(myFile, 0, SEEK_END);
|
||||
size = ftell(myFile);
|
||||
fseek(myFile, 0, SEEK_SET);
|
||||
return size;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Save in the current file open
|
||||
*
|
||||
* @param[in,out] myFile pointer on the file where data might be writed
|
||||
*
|
||||
* @return true if OK / false if an error occured
|
||||
*
|
||||
*/
|
||||
bool EdnVectorBuf::DumpIn(FILE *myFile)
|
||||
{
|
||||
bool ret = true;
|
||||
// write Data
|
||||
(void)fwrite(m_data, sizeof(int8_t), m_gapStart, myFile);
|
||||
(void)fwrite(&m_data[m_gapEnd], sizeof(int8_t), m_allocated - m_gapEnd, myFile);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Load in the current file open
|
||||
*
|
||||
* @param[in,out] myFile pointer on the file where data might be read
|
||||
*
|
||||
* @return true if OK / false if an error occured
|
||||
*
|
||||
*/
|
||||
bool EdnVectorBuf::DumpFrom(FILE *myFile)
|
||||
{
|
||||
bool ret = true;
|
||||
int32_t length = getFileSize(myFile);
|
||||
// error case ...
|
||||
if (length < 0) {
|
||||
length = 0;
|
||||
}
|
||||
// allocate the current buffer :
|
||||
ChangeAllocation(length + GAP_SIZE_MIN);
|
||||
|
||||
// insert Data
|
||||
int32_t nbReadData = fread(&m_data[GAP_SIZE_MIN], sizeof(int8_t), length, myFile);
|
||||
EDN_INFO("load data : filesize=" << length << ", readData=" << nbReadData);
|
||||
// check ERROR
|
||||
if (nbReadData != length) {
|
||||
EDN_ERROR("load data pb : filesize=" << length << ", readData=" << nbReadData);
|
||||
ret = false;
|
||||
}
|
||||
// set the gapsize at the end ...
|
||||
m_gapStart = 0;
|
||||
m_gapEnd = GAP_SIZE_MIN;
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @brief Re-copy operator
|
||||
*
|
||||
* @param[in] Evb Vector that might be copy
|
||||
*
|
||||
* @return reference on the curent re-copy vector
|
||||
*
|
||||
*/
|
||||
EdnVectorBuf& EdnVectorBuf::operator=(const EdnVectorBuf & Evb)
|
||||
{
|
||||
if( this != &Evb ) // avoid copy to itself
|
||||
{
|
||||
if (NULL!=m_data) {
|
||||
EDN_FREE(m_data);
|
||||
m_data = NULL;
|
||||
}
|
||||
// Set the new value
|
||||
m_allocated = Evb.m_allocated;
|
||||
m_gapStart = Evb.m_gapStart;
|
||||
m_gapEnd = Evb.m_gapEnd;
|
||||
// allocate all same data
|
||||
EDN_MALLOC(m_data, m_allocated, int8_t);
|
||||
EDN_ASSERT(NULL!=m_data, "Error in data allocation");
|
||||
// Copy all data ...
|
||||
memcpy(m_data, Evb.m_data, m_allocated * sizeof(int8_t) );
|
||||
}
|
||||
// Return the curent pointer
|
||||
return *this;
|
||||
}
|
||||
|
||||
int8_t EdnVectorBuf::operator[] (int32_t pos)
|
||||
{
|
||||
EDN_ASSERT(0 <= pos || pos < Size(), "try to read an element non existing");
|
||||
if (pos < m_gapStart) {
|
||||
return m_data[pos];
|
||||
}
|
||||
return m_data[pos + m_gapEnd-m_gapStart];
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Get a current element in the vector
|
||||
*
|
||||
* @param[in] pos Desired position read
|
||||
*
|
||||
* @return Reference on the Element
|
||||
*
|
||||
*/
|
||||
int8_t& EdnVectorBuf::Get(int32_t pos)
|
||||
{
|
||||
EDN_ASSERT(0 <= pos || pos < Size(), "try to read an element non existing");
|
||||
if (pos < m_gapStart) {
|
||||
return m_data[pos];
|
||||
}
|
||||
return m_data[pos + m_gapEnd-m_gapStart];
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief
|
||||
*
|
||||
* @param[in,out] ---
|
||||
*
|
||||
* @return ---
|
||||
*
|
||||
*/
|
||||
void EdnVectorBuf::Get(int32_t pos, int32_t nbElement, EdnVectorBin<int8_t> &tmpBuffer)
|
||||
{
|
||||
tmpBuffer.Clear();
|
||||
if (pos < m_gapStart) {
|
||||
if (pos + nbElement < m_gapStart) {
|
||||
tmpBuffer.PushBack(&m_data[pos], nbElement);
|
||||
} else {
|
||||
tmpBuffer.PushBack(&m_data[pos], m_gapStart - pos);
|
||||
tmpBuffer.PushBack(&m_data[m_gapEnd], nbElement - (m_gapStart - pos) );
|
||||
}
|
||||
} else {
|
||||
tmpBuffer.PushBack(&m_data[pos+(m_gapEnd-m_gapStart)], nbElement);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Add at the Last position of the Vector
|
||||
*
|
||||
* @param[in] item Element to add at the end of vector
|
||||
*
|
||||
* @return ---
|
||||
*
|
||||
*/
|
||||
void EdnVectorBuf::PushBack(const int8_t& item)
|
||||
{
|
||||
Insert( Size(), item);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Remove the last element of the vector
|
||||
*
|
||||
* @param ---
|
||||
*
|
||||
* @return ---
|
||||
*
|
||||
*/
|
||||
void EdnVectorBuf::PopBack(void)
|
||||
{
|
||||
if (Size()>0) {
|
||||
Remove( Size() );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Remove data in the buffer
|
||||
*
|
||||
* @param[in]
|
||||
*
|
||||
* @return ---
|
||||
*
|
||||
*/
|
||||
void EdnVectorBuf::Remove(int32_t pos, int32_t nbRemoveElement)
|
||||
{
|
||||
if( pos > Size()
|
||||
|| pos < 0 ) {
|
||||
EDN_ERROR("Request higher than buffer size : pos="<<pos<< " bufferSize="<<Size());
|
||||
return;
|
||||
}
|
||||
if( pos+nbRemoveElement > Size() ) {
|
||||
EDN_ERROR("Request remove more element than expected in the buffer pos+nbRemoveElement="<<pos+nbRemoveElement<< " bufferSize="<<Size());
|
||||
return;
|
||||
}
|
||||
if (false == GapMove(pos) ) {
|
||||
return;
|
||||
}
|
||||
// Remove elements :
|
||||
if (m_allocated==m_gapEnd) {
|
||||
m_gapStart -= nbRemoveElement;
|
||||
} else {
|
||||
m_gapEnd += nbRemoveElement;
|
||||
}
|
||||
// Resize buffer if needed...
|
||||
GapCheckMaxSize();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Change the current allocation to the corect one (depend on the current size)
|
||||
*
|
||||
* @param[in] newSize Minimum number of element needed
|
||||
*
|
||||
* @return ---
|
||||
*
|
||||
*/
|
||||
void EdnVectorBuf::Clear(void)
|
||||
{
|
||||
// Remove all element in the buffer
|
||||
Remove(0, Size() );
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Change the current allocation to the corect one (depend on the current size)
|
||||
*
|
||||
* @param[in] newSize Minimum number of element needed
|
||||
*
|
||||
* @return ---
|
||||
*
|
||||
*/
|
||||
void EdnVectorBuf::ChangeAllocation(int32_t newSize)
|
||||
{
|
||||
// set the minimal size to 1
|
||||
if(newSize <= 0) {
|
||||
newSize = 1;
|
||||
}
|
||||
// set the size with the corect chose type :
|
||||
if (newSize == m_allocated) {
|
||||
return;
|
||||
}
|
||||
EDN_DEBUG("Change Allocation : " << m_allocated << " ==> " << newSize);
|
||||
// check if something is allocated :
|
||||
if (NULL == m_data) {
|
||||
// no data allocated ==> request an allocation (might be the first)
|
||||
EDN_MALLOC(m_data, newSize, int8_t);
|
||||
} else {
|
||||
// move datas
|
||||
EDN_REALLOC(m_data, newSize, int8_t);
|
||||
}
|
||||
// Check result with assert :
|
||||
EDN_ASSERT(NULL!=m_data, "Error in data allocation");
|
||||
// set the new allocation size
|
||||
m_allocated = newSize;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief
|
||||
*
|
||||
* @param[in,out] ---
|
||||
*
|
||||
* @return ---
|
||||
*
|
||||
*/
|
||||
void EdnVectorBuf::Insert(int32_t pos, const int8_t& item)
|
||||
{
|
||||
if( pos > Size()
|
||||
|| pos < 0 ) {
|
||||
EDN_ERROR("Request higher than buffer size : pos="<<pos<< " bufferSize="<<Size());
|
||||
return;
|
||||
}
|
||||
if( 0 == GapSize() ) {
|
||||
if (false == GapResize(pos, GAP_SIZE_MIN + 1) ) {
|
||||
return;
|
||||
}
|
||||
} else if( pos == m_gapStart
|
||||
&& pos == m_gapEnd-1 )
|
||||
{
|
||||
// mothing to do ...
|
||||
} else {
|
||||
if (false == GapMove(pos)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
if(pos == m_gapStart) {
|
||||
m_data[m_gapStart] = item;
|
||||
m_gapStart++;
|
||||
} else {
|
||||
m_data[m_gapEnd-1] = item;
|
||||
m_gapEnd--;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief
|
||||
*
|
||||
* @param[in,out] ---
|
||||
*
|
||||
* @return ---
|
||||
*
|
||||
*/
|
||||
void EdnVectorBuf::Insert(int32_t pos, EdnVectorBin<int8_t>& items)
|
||||
{
|
||||
if( pos > Size()
|
||||
|| pos < 0 ) {
|
||||
EDN_ERROR("Request higher than buffer size : pos="<<pos<< " bufferSize="<<Size());
|
||||
return;
|
||||
}
|
||||
if( items.Size() > GapSize() ) {
|
||||
if (false == GapResize(pos, GAP_SIZE_MIN + items.Size()) ) {
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
if (false == GapMove(pos) ) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
int32_t i;
|
||||
for(i=0; i<items.Size(); i++) {
|
||||
m_data[m_gapStart+i] = items[i];
|
||||
}
|
||||
m_gapStart += items.Size();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief
|
||||
*
|
||||
* @param[in,out] ---
|
||||
*
|
||||
* @return ---
|
||||
*
|
||||
*/
|
||||
void EdnVectorBuf::Replace(int32_t pos, const int8_t& item)
|
||||
{
|
||||
if( pos > Size()
|
||||
|| pos < 0 ) {
|
||||
EDN_ERROR("Request higher than buffer size : pos="<<pos<< " bufferSize="<<Size());
|
||||
return;
|
||||
}
|
||||
// just replace the element, not update Gap position
|
||||
if (pos < m_gapStart) {
|
||||
m_data[pos] = item;
|
||||
} else {
|
||||
m_data[pos+GapSize()] = item;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief
|
||||
*
|
||||
* @param[in,out] ---
|
||||
*
|
||||
* @return ---
|
||||
*
|
||||
*/
|
||||
void EdnVectorBuf::Replace(int32_t pos, int32_t nbRemoveElement, EdnVectorBin<int8_t>& items)
|
||||
{
|
||||
if( pos > Size()
|
||||
|| pos < 0 ) {
|
||||
EDN_ERROR("Request higher than buffer size : pos="<<pos<< " bufferSize="<<Size());
|
||||
return;
|
||||
}
|
||||
if( pos+nbRemoveElement > Size() ) {
|
||||
EDN_ERROR("Request remove more element than expected in the buffer pos+nbRemoveElement="<<pos+nbRemoveElement<< " bufferSize="<<Size());
|
||||
return;
|
||||
}
|
||||
if (false == GapMove(pos)) {
|
||||
return;
|
||||
}
|
||||
// Remove elements :
|
||||
m_gapEnd += nbRemoveElement;
|
||||
//Display();
|
||||
// insert elements
|
||||
Insert(pos, items);
|
||||
// Resize buffer if needed...
|
||||
GapCheckMaxSize();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief
|
||||
*
|
||||
* @param[in,out] ---
|
||||
*
|
||||
* @return ---
|
||||
*
|
||||
*/
|
||||
bool EdnVectorBuf::GapMove(int32_t pos)
|
||||
{
|
||||
if( pos > Size()
|
||||
|| pos < 0 ) {
|
||||
EDN_ERROR("Request higher than buffer size : pos="<<pos<< " bufferSize="<<Size());
|
||||
return false;
|
||||
}
|
||||
int32_t gapLen = m_gapEnd - m_gapStart;
|
||||
if (pos > m_gapStart) {
|
||||
memmove(&m_data[m_gapStart], &m_data[m_gapEnd], pos - m_gapStart);
|
||||
} else {
|
||||
memmove(&m_data[pos + gapLen], &m_data[pos], m_gapStart - pos);
|
||||
}
|
||||
m_gapEnd += pos - m_gapStart;
|
||||
m_gapStart += pos - m_gapStart;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief
|
||||
*
|
||||
* @param[in,out] ---
|
||||
*
|
||||
* @return ---
|
||||
*
|
||||
*/
|
||||
bool EdnVectorBuf::GapResize(int32_t pos, int32_t newGapLen)
|
||||
{
|
||||
if( pos > Size()
|
||||
|| pos < 0 ) {
|
||||
EDN_ERROR("Request higher than buffer size : pos="<<pos<< " bufferSize="<<Size());
|
||||
return false;
|
||||
}
|
||||
int32_t previousSize = Size();
|
||||
if (newGapLen == GapSize() ) {
|
||||
// nothing to do ...
|
||||
return true;
|
||||
} else {
|
||||
if (newGapLen > GapSize() ) {
|
||||
// reallocation
|
||||
ChangeAllocation( previousSize + newGapLen);
|
||||
}
|
||||
// move Data
|
||||
if (pos <= m_gapStart) {
|
||||
// just move the end of the gap
|
||||
memmove(&m_data[m_gapStart + newGapLen], &m_data[m_gapEnd], previousSize - m_gapStart);
|
||||
// update gap end position
|
||||
m_gapEnd = m_gapStart + newGapLen;
|
||||
if (pos < m_gapStart) {
|
||||
if (false == GapMove(pos)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
// no else
|
||||
} else {
|
||||
if (false == GapMove(pos) ) {
|
||||
return false;
|
||||
}
|
||||
memmove(&m_data[m_gapStart + newGapLen], &m_data[m_gapEnd], previousSize - m_gapStart);
|
||||
}
|
||||
if (newGapLen < GapSize() ) {
|
||||
// rellocation
|
||||
ChangeAllocation(previousSize + newGapLen);
|
||||
}
|
||||
}
|
||||
// update gap position
|
||||
m_gapStart = pos;
|
||||
m_gapEnd = pos + newGapLen;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief
|
||||
*
|
||||
* @param[in,out] ---
|
||||
*
|
||||
* @return ---
|
||||
*
|
||||
*/
|
||||
void EdnVectorBuf::GapCheckMaxSize(void)
|
||||
{
|
||||
if(GapSize() > GAP_SIZE_MAX) {
|
||||
int32_t currentSize = Size();
|
||||
// Change the gap Size
|
||||
if (false == GapResize(m_gapStart, GAP_SIZE_MAX) ) {
|
||||
return;
|
||||
}
|
||||
// remove deprecated elements at the end of the buffer ...
|
||||
ChangeAllocation(currentSize + GAP_SIZE_MAX);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief
|
||||
*
|
||||
* @param[in,out] ---
|
||||
*
|
||||
* @return ---
|
||||
*
|
||||
*/
|
||||
void EdnVectorBuf::Display(void)
|
||||
{
|
||||
EDN_INFO(" Display Buffer : Size="<<Size()<<" m_allocated="<<m_allocated<<" m_gapStart="<<m_gapStart<<" m_gapEnd="<<m_gapEnd);
|
||||
for(int32_t i=0; i<m_allocated; i++) {
|
||||
if (i>= m_gapStart && i< m_gapEnd) {
|
||||
EDN_INFO( "Element " << i << " : GAP");
|
||||
} else {
|
||||
EDN_INFO( "Element " << i << " : " << m_data[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @brief
|
||||
*
|
||||
* @param[in,out] ---
|
||||
*
|
||||
* @return ---
|
||||
*
|
||||
*/
|
||||
void TestEdnVectorBuf(void)
|
||||
{
|
||||
EdnVectorBuf myBufferTmp;
|
||||
int32_t i;
|
||||
|
||||
//invert data
|
||||
for (i=0; i<50; i++) {
|
||||
myBufferTmp.Insert(0, 'a' + i%26);
|
||||
}
|
||||
myBufferTmp.Display();
|
||||
myBufferTmp.Clear();
|
||||
myBufferTmp.Display();
|
||||
|
||||
myBufferTmp.Remove(2, 300);
|
||||
/*
|
||||
char plop='a';
|
||||
myBufferTmp.Insert(0, plop);
|
||||
myBufferTmp.Display();
|
||||
plop='b';
|
||||
myBufferTmp.Insert(0, plop);
|
||||
myBufferTmp.Display();
|
||||
plop='c';
|
||||
myBufferTmp.Insert(0, plop);
|
||||
myBufferTmp.Display();
|
||||
plop='d';
|
||||
myBufferTmp.Insert(0, plop);
|
||||
myBufferTmp.Display();
|
||||
plop='e';
|
||||
myBufferTmp.Insert(0, plop);
|
||||
myBufferTmp.Display();
|
||||
plop='f';
|
||||
myBufferTmp.Insert(0, plop);
|
||||
myBufferTmp.Display();
|
||||
plop='g';
|
||||
myBufferTmp.Insert(0, plop);
|
||||
myBufferTmp.Display();
|
||||
plop='h';
|
||||
myBufferTmp.Insert(0, plop);
|
||||
myBufferTmp.Display();
|
||||
plop='m';
|
||||
|
||||
EdnVectorBin<int8_t> items;
|
||||
items.PushBack('i');
|
||||
items.PushBack('j');
|
||||
items.PushBack('k');
|
||||
items.PushBack('l');
|
||||
items.PushBack('m');
|
||||
items.PushBack('n');
|
||||
items.PushBack('o');
|
||||
items.PushBack('p');
|
||||
|
||||
|
||||
|
||||
myBufferTmp.Insert(3, items);
|
||||
myBufferTmp.Display();
|
||||
|
||||
|
||||
|
||||
plop='7';
|
||||
myBufferTmp.Insert(7, plop);
|
||||
myBufferTmp.Display();
|
||||
|
||||
myBufferTmp.Replace(8, 'z');
|
||||
myBufferTmp.Display();
|
||||
|
||||
items.Clear();
|
||||
items.PushBack('1');
|
||||
items.PushBack('2');
|
||||
items.PushBack('3');
|
||||
myBufferTmp.Replace(10, 4, items);
|
||||
myBufferTmp.Display();
|
||||
|
||||
|
||||
myBufferTmp.PushBack('a');
|
||||
myBufferTmp.PushBack('a');
|
||||
myBufferTmp.PushBack('a');
|
||||
myBufferTmp.PushBack('a');
|
||||
myBufferTmp.Display();
|
||||
|
||||
|
||||
myBufferTmp.PopBack();
|
||||
myBufferTmp.PopBack();
|
||||
myBufferTmp.PopBack();
|
||||
myBufferTmp.PopBack();
|
||||
myBufferTmp.Display();
|
||||
|
||||
myBufferTmp.Remove(2, 3);
|
||||
myBufferTmp.Display();
|
||||
*/
|
||||
|
||||
}
|
||||
|
||||
|
342
Sources/tools/EdnTemplate/EdnVectorBuf.h
Normal file
342
Sources/tools/EdnTemplate/EdnVectorBuf.h
Normal file
@@ -0,0 +1,342 @@
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file EdnEdnVectorBuf.h
|
||||
* @brief Editeur De N'ours : Basic EdnVectorBuf for direct data insertion (template)
|
||||
* @author Edouard DUPIN
|
||||
* @date 07/04/2011
|
||||
* @par Project
|
||||
* Edn
|
||||
*
|
||||
* @par Copyright
|
||||
* Copyright 2010 Edouard DUPIN, all right reserved
|
||||
*
|
||||
* This software is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY.
|
||||
*
|
||||
* Licence summary :
|
||||
* You can modify and redistribute the sources code and binaries.
|
||||
* You can send me the bug-fix
|
||||
* You can not earn money with this Software (if the source extract from Edn
|
||||
* represent less than 50% of original Sources)
|
||||
* Term of the licence in in the file licence.txt.
|
||||
*
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef __EDN_VECTOR_BUF_H__
|
||||
#define __EDN_VECTOR_BUF_H__
|
||||
|
||||
#include "toolsMemory.h"
|
||||
#include "EdnVectorBin.h"
|
||||
|
||||
#undef __class__
|
||||
#define __class__ "EdnVectorBuf"
|
||||
|
||||
// minimum gapSize when allocated
|
||||
#define GAP_SIZE_MIN (80)
|
||||
// maximum gap that is automaticly resize
|
||||
#define GAP_SIZE_MAX (GAP_SIZE_MIN*4)
|
||||
|
||||
|
||||
/*
|
||||
|
||||
|
||||
|
||||
______________________________________________________________________________________
|
||||
| |
|
||||
| |
|
||||
| <GapStart |
|
||||
| *******************************************************************|
|
||||
|****************************************** |
|
||||
| Gap Stop > |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
|____________________________________________________________________________________|
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @brief EdnVectorBuf classes ...
|
||||
*/
|
||||
class EdnVectorBuf
|
||||
{
|
||||
public:
|
||||
class Iterator
|
||||
{
|
||||
// Private data :
|
||||
private:
|
||||
int32_t m_current; // curent Id on the vector
|
||||
EdnVectorBuf * m_EdnVectorBuf; // Pointer on the curent element of the vectorBin
|
||||
public:
|
||||
/**
|
||||
* @brief Basic itarator constructor with no link with an EdnVector
|
||||
*/
|
||||
Iterator(void):
|
||||
m_current(-1),
|
||||
m_EdnVectorBuf(NULL)
|
||||
{
|
||||
// nothing to do ...
|
||||
}
|
||||
/**
|
||||
* @brief Recopy constructor on a specific EdnVector.
|
||||
* @param[in] otherIterator The Iterator that might be copy
|
||||
*/
|
||||
Iterator(const Iterator & otherIterator):
|
||||
m_current(otherIterator.m_current),
|
||||
m_EdnVectorBuf(otherIterator.m_EdnVectorBuf)
|
||||
{
|
||||
// nothing to do ...
|
||||
}
|
||||
/**
|
||||
* @brief Asignation operator.
|
||||
* @param[in] otherIterator The Iterator that might be copy
|
||||
* @return reference on the curent Iterator
|
||||
*/
|
||||
Iterator& operator=(const Iterator & otherIterator)
|
||||
{
|
||||
m_current = otherIterator.m_current;
|
||||
m_EdnVectorBuf = otherIterator.m_EdnVectorBuf;
|
||||
return *this;
|
||||
}
|
||||
/**
|
||||
* @brief Basic destructor
|
||||
*/
|
||||
~Iterator(void)
|
||||
{
|
||||
m_current = -1;
|
||||
m_EdnVectorBuf = NULL;
|
||||
}
|
||||
/**
|
||||
* @brief gaet element position in the system
|
||||
*/
|
||||
int32_t Position(void)
|
||||
{
|
||||
if(0 > m_current) {
|
||||
return 0;
|
||||
} else if (m_EdnVectorBuf->Size() <= m_current) {
|
||||
return m_EdnVectorBuf->Size();
|
||||
} else {
|
||||
return m_current;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* @brief basic boolean cast
|
||||
* @return true if the element is present in the EdnVector size
|
||||
*/
|
||||
operator bool ()
|
||||
{
|
||||
if( 0 <= m_current
|
||||
&& m_current < m_EdnVectorBuf->Size() )
|
||||
{
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* @brief Incremental operator
|
||||
* @return Reference on the current iterator incremented
|
||||
*/
|
||||
Iterator& operator++ ()
|
||||
{
|
||||
if( NULL != m_EdnVectorBuf
|
||||
&& m_current < m_EdnVectorBuf->Size() )
|
||||
{
|
||||
m_current++;
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
/**
|
||||
* @brief Decremental operator
|
||||
* @return Reference on the current iterator decremented
|
||||
*/
|
||||
Iterator& operator-- ()
|
||||
{
|
||||
if (m_current >= 0) {
|
||||
m_current--;
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
/**
|
||||
* @brief Incremental operator
|
||||
* @return Reference on a new iterator and increment the other one
|
||||
*/
|
||||
Iterator operator++ (int32_t)
|
||||
{
|
||||
Iterator it(*this);
|
||||
++(*this);
|
||||
return it;
|
||||
}
|
||||
/**
|
||||
* @brief Decremental operator
|
||||
* @return Reference on a new iterator and decrement the other one
|
||||
*/
|
||||
Iterator operator-- (int32_t)
|
||||
{
|
||||
Iterator it(*this);
|
||||
--(*this);
|
||||
return it;
|
||||
}
|
||||
/**
|
||||
* @brief Get reference on the current Element
|
||||
* @return the reference on the current Element
|
||||
*/
|
||||
int8_t & operator-> () const
|
||||
{
|
||||
EDN_CHECK_INOUT(m_current >= 0 && m_current < m_EdnVectorBuf->Size());
|
||||
return m_EdnVectorBuf->Get(m_current);
|
||||
}
|
||||
/**
|
||||
* @brief Get reference on the current Element
|
||||
* @return the reference on the current Element
|
||||
*/
|
||||
int8_t & operator* () const
|
||||
{
|
||||
EDN_CHECK_INOUT(m_current >= 0 && m_current < m_EdnVectorBuf->Size());
|
||||
return m_EdnVectorBuf->Get(m_current);
|
||||
}
|
||||
private:
|
||||
/**
|
||||
* @brief
|
||||
*
|
||||
* @param[in,out] ---
|
||||
*
|
||||
* @return ---
|
||||
*
|
||||
*/
|
||||
Iterator(EdnVectorBuf * Evb, int32_t pos):
|
||||
m_current(pos),
|
||||
m_EdnVectorBuf(Evb)
|
||||
{
|
||||
// nothing to do ...
|
||||
}
|
||||
friend class EdnVectorBuf;
|
||||
};
|
||||
private:
|
||||
int8_t * m_data; //!< pointer on the curetn table of Data
|
||||
int32_t m_allocated; //!< Current allocated size
|
||||
// empty part of the buffer data
|
||||
int32_t m_gapStart; //!< points to the first character of the gap
|
||||
int32_t m_gapEnd; //!< points to the first char after the gap
|
||||
public:
|
||||
EdnVectorBuf(int32_t count = 0);
|
||||
EdnVectorBuf(const EdnVectorBuf & Evb);
|
||||
~EdnVectorBuf();
|
||||
|
||||
bool DumpIn( FILE *myFile);
|
||||
bool DumpFrom( FILE *myFile);
|
||||
|
||||
EdnVectorBuf & operator=( const EdnVectorBuf & Evb);
|
||||
int8_t operator[] (int32_t pos);
|
||||
int8_t & Get( int32_t pos);
|
||||
void Get( int32_t pos, int32_t nbElement, EdnVectorBin<int8_t> &tmpBuffer);
|
||||
// insert functions
|
||||
void PushBack( const int8_t& item);
|
||||
void Insert( int32_t pos, const int8_t& item);
|
||||
void Insert( int32_t pos, EdnVectorBin<int8_t>& items);
|
||||
// Remove and insert functions
|
||||
void Replace( int32_t pos, const int8_t& item);
|
||||
void Replace( int32_t pos, int32_t nbRemoveElement, EdnVectorBin<int8_t>& items);
|
||||
// Revove fonctions
|
||||
void Remove( int32_t pos, int32_t nbRemoveElement = 1);
|
||||
void PopBack( void);
|
||||
void Clear( void);
|
||||
|
||||
|
||||
void Fit(void);
|
||||
|
||||
void Display(void);
|
||||
|
||||
/**
|
||||
* @brief Get a current element in the vector (iterator system)
|
||||
* @param[in] RealElementPosition Real position in the buffer (only use in the ITERATOR)
|
||||
* @return Reference on the Element
|
||||
*/
|
||||
int8_t & GetDirect(int32_t RealElementPosition){ return m_data[RealElementPosition]; };
|
||||
/**
|
||||
* @brief Get the number of element in the vector
|
||||
* @return The number requested
|
||||
*/
|
||||
int32_t Size(void) { return m_allocated - GapSize(); };
|
||||
|
||||
Iterator Position(int32_t pos)
|
||||
{
|
||||
return Iterator(this, pos);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get an Iterator on the start position of the Vector
|
||||
* @return The Iterator
|
||||
*/
|
||||
Iterator Begin()
|
||||
{
|
||||
return Position(0);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get an Iterator on the end position of the Vector
|
||||
* @return The Iterator
|
||||
*/
|
||||
Iterator End()
|
||||
{
|
||||
return Position( Size()-1 );
|
||||
}
|
||||
private:
|
||||
// TODO : Set a boolean at the return value to prevent internal error ...
|
||||
void ChangeAllocation( int32_t newSize);
|
||||
bool GapMove( int32_t pos);
|
||||
bool GapResize( int32_t pos, int32_t newGapLen);
|
||||
// get current gap Size
|
||||
int32_t GapSize( void) { return m_gapEnd - m_gapStart; };
|
||||
void GapCheckMaxSize( void);
|
||||
};
|
||||
|
||||
#undef __class__
|
||||
#define __class__ NULL
|
||||
|
||||
void TestEdnVectorBuf(void);
|
||||
|
||||
#endif
|
85
Sources/tools/EdnTemplate/Singleton.h
Executable file
85
Sources/tools/EdnTemplate/Singleton.h
Executable file
@@ -0,0 +1,85 @@
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file Singleton.h
|
||||
* @brief Editeur De N'ours : singleton system class
|
||||
* @author Edouard DUPIN
|
||||
* @date 04/12/2010
|
||||
* @par Project
|
||||
* Edn
|
||||
*
|
||||
* @par Copyright
|
||||
* Copyright 2010 Edouard DUPIN, all right reserved
|
||||
*
|
||||
* This software is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY.
|
||||
*
|
||||
* Licence summary :
|
||||
* You can modify and redistribute the sources code and binaries.
|
||||
* You can send me the bug-fix
|
||||
* You can not earn money with this Software (if the source extract from Edn
|
||||
* represent less than 50% of original Sources)
|
||||
* Term of the licence in in the file licence.txt.
|
||||
*
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef __SINGLETON_H__
|
||||
#define __SINGLETON_H__
|
||||
|
||||
#include <iostream>
|
||||
using namespace std;
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Singleton - modèle Singleton applicable à n'importe quelle classe.
|
||||
//
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
template <typename T>
|
||||
class Singleton
|
||||
{
|
||||
protected:
|
||||
// Constructeur/destructeur
|
||||
Singleton() { }
|
||||
~Singleton() { /*std::cout << "destroying singleton." << std::endl;*/ }
|
||||
|
||||
public:
|
||||
// Interface publique
|
||||
static T *getInstance()
|
||||
{
|
||||
if (NULL == _singleton)
|
||||
{
|
||||
/*std::cout << "C: Singleton | creating singleton." << std::endl;*/
|
||||
_singleton = new T;
|
||||
}
|
||||
/*
|
||||
else
|
||||
{
|
||||
std::cout << "C: Singleton | singleton already created!" << std::endl;
|
||||
}
|
||||
*/
|
||||
|
||||
return (static_cast<T*> (_singleton));
|
||||
}
|
||||
|
||||
static void kill()
|
||||
{
|
||||
if (NULL != _singleton)
|
||||
{
|
||||
delete _singleton;
|
||||
_singleton = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
// Unique instance
|
||||
static T *_singleton;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
T *Singleton<T>::_singleton = NULL;
|
||||
|
||||
#endif
|
||||
|
||||
|
Reference in New Issue
Block a user