Ryan Malloy a7f62e5d7e Add Silicon Labs CP210x manufacturing library source
- Library source from AN721SW (cp210xmanufacturing_1.0.tar.gz)
- Manufacturing tool source (cp210xsmt)
- Builds 64-bit shared library with: make LIB_ARCH=64
- Datasheets and app notes in docs/
2026-01-30 10:31:39 -07:00

156 lines
3.4 KiB
C++

#pragma once
/////////////////////////////////////////////////////////////////////////////
// Includes
/////////////////////////////////////////////////////////////////////////////
#include "OsDep.h"
#include <vector>
#include <algorithm>
/////////////////////////////////////////////////////////////////////////////
// CDeviceList Class
/////////////////////////////////////////////////////////////////////////////
template <class T>
class CDeviceList
{
// Constructor/Destructor
public:
CDeviceList();
~CDeviceList();
// Public Methods
public:
BOOL Validate(T* object);
T* Construct();
void Add(T* object);
void Destruct(T* object);
// Protected Members
protected:
std::vector<T*> m_list;
CCriticalSectionLock m_lock;
};
/////////////////////////////////////////////////////////////////////////////
// CDeviceList Class - Constructor/Destructor
/////////////////////////////////////////////////////////////////////////////
template <class T>
CDeviceList<T>::CDeviceList()
{
}
template <class T>
CDeviceList<T>::~CDeviceList()
{
// Enter critical section
m_lock.Lock();
// Deallocate all device objects
// (Destructor closes the devices)
for (DWORD i = 0; i < m_list.size(); i++)
{
delete m_list[i];
}
// Remove all device references
m_list.clear();
// Leave critical section
m_lock.Unlock();
}
/////////////////////////////////////////////////////////////////////////////
// CDeviceList Class - Public Methods
/////////////////////////////////////////////////////////////////////////////
// Make sure that a T pointer is valid
template <class T>
BOOL CDeviceList<T>::Validate(T* object)
{
BOOL retVal = FALSE;
// Enter critical section
m_lock.Lock();
if (std::find(m_list.begin(), m_list.end(), object) != m_list.end())
{
retVal = TRUE;
}
// Unlock critical section
m_lock.Unlock();
return retVal;
}
// Create a new T object on the heap
// and call the T constructor
// and track memory usage in m_list
template <class T>
T* CDeviceList<T>::Construct()
{
// Create the object memory on the heap
// Call the T constructor
T* object = new T();
// Enter critical section
m_lock.Lock();
m_list.push_back(object);
// Leave critical section
m_lock.Unlock();
return object;
}
// Add a T object in m_list
template <class T>
void CDeviceList<T>::Add(T* object)
{
// Enter critical section
m_lock.Lock();
m_list.push_back(object);
// Leave critical section
m_lock.Unlock();
}
// Remove the object pointer from the m_list
// vector and call the T destructor by
// deallocating the object
template <class T>
void CDeviceList<T>::Destruct(T* object)
{
// Enter critical section
m_lock.Lock();
if (Validate(object))
{
// Find the object pointer in the vector and return an iterator
typename std::vector<T*>::iterator iter = std::find(m_list.begin(), m_list.end(), object);
// Remove the pointer from the vector if it exists
if (iter != m_list.end())
{
m_list.erase(iter);
}
// Call the T destructor
// Free the object memory on the heap
delete object;
}
// Leave critical section
m_lock.Unlock();
}