#ifndef FRAMEWORK_STORAGEMANAGER_POOLMANAGER_TPP_
#define FRAMEWORK_STORAGEMANAGER_POOLMANAGER_TPP_

template<uint8_t NUMBER_OF_POOLS>
inline PoolManager<NUMBER_OF_POOLS>::PoolManager(object_id_t setObjectId,
		const uint16_t element_sizes[NUMBER_OF_POOLS],
		const uint16_t n_elements[NUMBER_OF_POOLS]) :
		LocalPool<NUMBER_OF_POOLS>(setObjectId, element_sizes, n_elements, true) {
	mutex = MutexFactory::instance()->createMutex();
}

template<uint8_t NUMBER_OF_POOLS>
inline PoolManager<NUMBER_OF_POOLS>::~PoolManager(void) {
	MutexFactory::instance()->deleteMutex(mutex);
}

template<uint8_t NUMBER_OF_POOLS>
inline ReturnValue_t PoolManager<NUMBER_OF_POOLS>::reserveSpace(
		const uint32_t size, store_address_t* address, bool ignoreFault) {
	MutexHelper mutexHelper(mutex,MutexIF::BLOCKING);
	ReturnValue_t status = LocalPool<NUMBER_OF_POOLS>::reserveSpace(size,
			address,ignoreFault);
	return status;
}

template<uint8_t NUMBER_OF_POOLS>
inline ReturnValue_t PoolManager<NUMBER_OF_POOLS>::deleteData(
		store_address_t packet_id) {
	// debug << "PoolManager( " << translateObject(getObjectId()) <<
	//       " )::deleteData from store " << packet_id.pool_index <<
	//       ". id is "<< packet_id.packet_index << std::endl;
	MutexHelper mutexHelper(mutex,MutexIF::BLOCKING);
	ReturnValue_t status = LocalPool<NUMBER_OF_POOLS>::deleteData(packet_id);
	return status;
}

template<uint8_t NUMBER_OF_POOLS>
inline ReturnValue_t PoolManager<NUMBER_OF_POOLS>::deleteData(uint8_t* buffer,
		size_t size, store_address_t* storeId) {
	MutexHelper mutexHelper(mutex,MutexIF::BLOCKING);
	ReturnValue_t status = LocalPool<NUMBER_OF_POOLS>::deleteData(buffer,
			size, storeId);
	return status;
}

template<uint8_t NUMBER_OF_POOLS>
inline ReturnValue_t PoolManager<NUMBER_OF_POOLS>::modifyData(
		store_address_t packet_id, uint8_t** packet_ptr, size_t* size) {
	MutexHelper mutexHelper(mutex,MutexIF::BLOCKING);
	ReturnValue_t status = LocalPool<NUMBER_OF_POOLS>::modifyData(packet_id,
				packet_ptr, size);
	return status;
}

#endif