aboutsummaryrefslogtreecommitdiffstats
path: root/host
diff options
context:
space:
mode:
authorJosh Blum <josh@joshknows.com>2011-02-11 12:35:48 -0800
committerJosh Blum <josh@joshknows.com>2011-02-11 12:35:48 -0800
commit4d6ae6a8d39e97a7dba53dfd4150ba93ddb470fa (patch)
tree6c8e931fcd6852abdc2ffee1525ca30623a52d00 /host
parent24c626a1476895a6cb7dbb26b438778c61e52fc2 (diff)
downloaduhd-4d6ae6a8d39e97a7dba53dfd4150ba93ddb470fa.tar.gz
uhd-4d6ae6a8d39e97a7dba53dfd4150ba93ddb470fa.tar.bz2
uhd-4d6ae6a8d39e97a7dba53dfd4150ba93ddb470fa.zip
uhd: third iteration of the reference vector
Hope we get it right this time. Reference vector now has its own pointer for the pointer/size 1 constuction case. In this case, the memory is initialized to the value of its own pointer. The previous two iterations were functionally wrong because it takes two pointers and size to accomplish this.
Diffstat (limited to 'host')
-rw-r--r--host/include/uhd/types/ref_vector.hpp40
1 files changed, 32 insertions, 8 deletions
diff --git a/host/include/uhd/types/ref_vector.hpp b/host/include/uhd/types/ref_vector.hpp
index efd4b8f89..0ae301647 100644
--- a/host/include/uhd/types/ref_vector.hpp
+++ b/host/include/uhd/types/ref_vector.hpp
@@ -29,30 +29,54 @@ namespace uhd{
*/
template <typename T> class ref_vector{
public:
- //! Create a reference vector from a pointer and size
- template <typename Ptr> ref_vector(Ptr *ptr, size_t size = 1):
- _mem(T(ptr)), _size(size)
+ /*!
+ * Create a reference vector of size 1 from a pointer.
+ * Therefore: rv[0] == ptr and rv.size() == 1
+ * \param ptr a pointer to a chunk of memory
+ */
+ template <typename Ptr> ref_vector(Ptr *ptr):
+ _ptr(T(ptr)), _mem(_mem_t(&_ptr)), _size(1)
{
/* NOP */
}
- //! Create a reference vector from a std::vector container
- template <typename Range> ref_vector(const Range &range):
- _mem(T(range.front())), _size(range.size())
+ /*!
+ * Create a reference vector from a std::vector container.
+ * Therefore: rv[n] == vec[n] and rv.size() == vec.size()
+ * \param range a const reference to an std::vector
+ */
+ template <typename Vector> ref_vector(const Vector &vec):
+ _ptr(T()), _mem(_mem_t(&vec.front())), _size(vec.size())
{
/* NOP */
}
+ /*!
+ * Create a reference vector from a pointer and a length
+ * Therefore: rv[n] == mem[n] and rv.size() == len
+ * \param mem a pointer to an array of pointers
+ * \param len the length of the array of pointers
+ */
+ ref_vector(const T *mem, size_t len):
+ _ptr(T()), _mem(_mem_t(mem)), _size(len)
+ {
+ /* NOP */
+ }
+
+ //! Index operator gets the value of rv[index]
const T &operator[](size_t index) const{
- return (&_mem)[index];
+ return _mem[index];
}
+ //! The number of elements in this container
size_t size(void) const{
return _size;
}
private:
- const T _mem;
+ const T _ptr;
+ typedef T* _mem_t;
+ const _mem_t _mem;
const size_t _size;
};