blob: 2c238a652dff58d50d0cc8161b143dc7702bffdc [file] [log] [blame]
/**
* Copyright (C) 2013 Regents of the University of California.
* @author: Jeff Thompson <jefft0@remap.ucla.edu>
* See COPYING for copyright and distribution information.
*/
#ifndef NDN_BLOB_HPP
#define NDN_BLOB_HPP
#include "../common.hpp"
#include "../c/util/blob.h"
namespace ndn {
/**
* A Blob holds a pointer to an immutable byte array implemented as const std::vector<uint8_t>.
* This is like a JavaScript string which is a pointer to an immutable string.
* It is OK to pass a pointer to the string because the new owner can't change the bytes
* of the string. However, like a JavaScript string, it is possible to change the pointer, and so this does allow
* the copy constructor and assignment to change the pointer. Also remember that the pointer can be null.
* (Note that we could have made Blob derive directly from vector<uint8_t> and then explicitly use
* a pointer to it like shared_ptr<Blob>, but this does not enforce immutability because we can't declare
* Blob as derived from const vector<uint8_t>.)
*/
class Blob : public ptr_lib::shared_ptr<const std::vector<uint8_t> > {
public:
/**
* Create a new Blob with a null pointer.
*/
Blob()
{
}
/**
* Create a new Blob with an immutable copy of the given array.
* @param value A pointer to the byte array which is copied.
* @param valueLength The length of value.
*/
Blob(const uint8_t* value, size_t valueLength)
: ptr_lib::shared_ptr<const std::vector<uint8_t> >(new std::vector<uint8_t>(value, value + valueLength))
{
}
/**
* Create a new Blob with an immutable copy of the array in the given vector.
* If you want to transfer the array without copying, the the vector has to start as a
* ptr_lib::shared_ptr<std::vector<uint8_t> > and you can use the Blob constructor with this type.
* @param value A reference to a vector which is copied.
*/
Blob(const std::vector<uint8_t> &value)
: ptr_lib::shared_ptr<const std::vector<uint8_t> >(new std::vector<uint8_t>(value))
{
}
/**
* Create a new Blob with an immutable copy of the array in the given Blob struct.
* @param blobStruct The C ndn_Blob struct to receive the pointer.
*/
Blob(const struct ndn_Blob& blobStruct)
: ptr_lib::shared_ptr<const std::vector<uint8_t> >(new std::vector<uint8_t>(blobStruct.value, blobStruct.value + blobStruct.length))
{
}
/**
* Create a new Blob to point to an existing byte array. IMPORTANT: After calling this constructor,
* if you keep a pointer to the array then you must treat the array as immutable and promise not to change it.
* @param value A pointer to a vector with the byte array. This takes another reference and does not copy the bytes.
*/
Blob(const ptr_lib::shared_ptr<std::vector<uint8_t> > &value)
: ptr_lib::shared_ptr<const std::vector<uint8_t> >(value)
{
}
Blob(const ptr_lib::shared_ptr<const std::vector<uint8_t> > &value)
: ptr_lib::shared_ptr<const std::vector<uint8_t> >(value)
{
}
/**
* Return the length of the immutable byte array.
*/
size_t
size() const
{
if (*this)
return (*this)->size();
else
return 0;
}
/**
* Return a const pointer to the first byte of the immutable byte array, or 0 if the pointer is null.
*/
const uint8_t*
buf() const
{
if (*this)
return &(*this)->front();
else
return 0;
}
/**
* Set the blobStruct to point to this Blob's byte array, without copying any memory.
* WARNING: The resulting pointer in blobStruct is invalid after a further use of this object which could reallocate memory.
* @param blobStruct The C ndn_Blob struct to receive the pointer.
*/
void
get(struct ndn_Blob& blobStruct) const
{
blobStruct.length = size();
if (size() > 0)
blobStruct.value = (uint8_t*)buf();
else
blobStruct.value = 0;
}
};
}
#endif