]> git.donarmstrong.com Git - bamtools.git/blob - src/api/internal/io/ByteArray_p.cpp
Updated file headers (filename, license, description, etc)
[bamtools.git] / src / api / internal / io / ByteArray_p.cpp
1 // ***************************************************************************
2 // ByteArray_p.cpp (c) 2011 Derek Barnett
3 // Marth Lab, Department of Biology, Boston College
4 // ---------------------------------------------------------------------------
5 // Last modified: 10 November 2011 (DB)
6 // ---------------------------------------------------------------------------
7 // Provides a dynamic, variable-length byte buffer
8 // ***************************************************************************
9
10 #include "api/internal/io/ByteArray_p.h"
11 using namespace BamTools;
12 using namespace BamTools::Internal;
13
14 #include <cstdlib>
15 #include <cstring>
16 using namespace std;
17
18 // --------------------------
19 // ByteArray implementation
20 // --------------------------
21
22 ByteArray::ByteArray(void)
23     : m_data()
24 { }
25
26 ByteArray::ByteArray(const string& value)
27     : m_data(value.begin(), value.end())
28 { }
29
30 ByteArray::ByteArray(const vector<char>& value)
31     : m_data(value)
32 { }
33
34 ByteArray::ByteArray(const char* value, size_t n) {
35     const string s(value, n);
36     m_data.assign(s.begin(), s.end());
37 }
38
39 ByteArray::ByteArray(const ByteArray& other)
40     : m_data(other.m_data)
41 { }
42
43 ByteArray::~ByteArray(void) { }
44
45 ByteArray& ByteArray::operator=(const ByteArray& other) {
46     m_data = other.m_data;
47     return *this;
48 }
49
50 void ByteArray::Clear(void) {
51     m_data.clear();
52 }
53
54 const char* ByteArray::ConstData(void) const {
55     return &m_data[0];
56 }
57
58 char* ByteArray::Data(void) {
59     return &m_data[0];
60 }
61
62 const char& ByteArray::operator[](size_t i) const {
63     return m_data[i];
64 }
65
66 char& ByteArray::operator[](size_t i) {
67     return m_data[i];
68 }
69
70 size_t ByteArray::IndexOf(const char c, const size_t from, const size_t to) const {
71     const size_t size = ( (to == 0 ) ? m_data.size() : to );
72     for ( size_t i = from; i < size; ++i ) {
73         if ( m_data.at(i) == c ) 
74             return i;
75     }
76     return m_data.size();
77 }
78
79 ByteArray& ByteArray::Remove(size_t from, size_t n) {
80
81     // if 'from' outside range, just return
82     const size_t originalSize = m_data.size();
83     if ( from >= originalSize )
84         return *this;
85
86     // if asked to clip from 'from' to end (or beyond), simply resize
87     if ( from + n >= originalSize )
88         Resize(from);
89
90     // otherwise, shift data & resize
91     else {
92         memmove( &m_data[from], &m_data[from+n], (originalSize-from-n) );
93         Resize(originalSize - n);
94     }
95
96     // return reference to modified byte array
97     return *this;
98 }
99
100 void ByteArray::Resize(size_t n) {
101     m_data.resize(n, 0);
102 }
103
104 size_t ByteArray::Size(void) const {
105     return m_data.size();
106 }
107
108 void ByteArray::Squeeze(void) {
109     vector<char> t(m_data);
110     t.swap(m_data);
111 }