More interfaces to the int array compression routines.
* src/misc/intvcomp.cc, src/misc/intvcomp.cc: Add interfaces to compress vector<int> to vector<unsigned>. * src/tgbatest/intvcomp.cc: Test them. * src/sanity/style.test: Refine check to avoid a spurious report.
This commit is contained in:
parent
3aa9c3bab6
commit
1b447c3676
5 changed files with 187 additions and 3 deletions
|
|
@ -1,3 +1,12 @@
|
|||
2011-04-12 Alexandre Duret-Lutz <adl@lrde.epita.fr>
|
||||
|
||||
More interfaces to the int array compression routines.
|
||||
|
||||
* src/misc/intvcomp.cc, src/misc/intvcomp.cc: Add interfaces to
|
||||
compress vector<int> to vector<unsigned>.
|
||||
* src/tgbatest/intvcomp.cc: Test them.
|
||||
* src/sanity/style.test: Refine check to avoid a spurious report.
|
||||
|
||||
2011-04-11 Alexandre Duret-Lutz <adl@lrde.epita.fr>
|
||||
|
||||
* iface/dve2/dve2.cc: Typo when handling dead==true.
|
||||
|
|
|
|||
|
|
@ -232,6 +232,50 @@ namespace spot
|
|||
std::vector<unsigned int>* result_;
|
||||
};
|
||||
|
||||
class int_vector_vector_compression:
|
||||
public stream_compression_base<int_vector_vector_compression>
|
||||
{
|
||||
public:
|
||||
int_vector_vector_compression(const std::vector<int>& input,
|
||||
std::vector<unsigned int>& output)
|
||||
: input_(input), pos_(input.begin()), end_(input.end()), output_(output)
|
||||
{
|
||||
}
|
||||
|
||||
void push_data(unsigned int i)
|
||||
{
|
||||
output_.push_back(i);
|
||||
}
|
||||
|
||||
bool have_data() const
|
||||
{
|
||||
return pos_ < end_;
|
||||
}
|
||||
|
||||
unsigned int next_data()
|
||||
{
|
||||
return static_cast<unsigned int>(*pos_++);
|
||||
}
|
||||
|
||||
bool skip_if(unsigned int val)
|
||||
{
|
||||
if (!have_data())
|
||||
return false;
|
||||
|
||||
if (static_cast<unsigned int>(*pos_) != val)
|
||||
return false;
|
||||
|
||||
++pos_;
|
||||
return true;
|
||||
}
|
||||
|
||||
protected:
|
||||
const std::vector<int>& input_;
|
||||
std::vector<int>::const_iterator pos_;
|
||||
std::vector<int>::const_iterator end_;
|
||||
std::vector<unsigned int>& output_;
|
||||
};
|
||||
|
||||
class int_array_array_compression:
|
||||
public stream_compression_base<int_array_array_compression>
|
||||
{
|
||||
|
|
@ -283,6 +327,14 @@ namespace spot
|
|||
};
|
||||
}
|
||||
|
||||
void
|
||||
int_vector_vector_compress(const std::vector<int>& input,
|
||||
std::vector<unsigned>& output)
|
||||
{
|
||||
int_vector_vector_compression c(input, output);
|
||||
c.run();
|
||||
}
|
||||
|
||||
const std::vector<unsigned int>*
|
||||
int_array_vector_compress(const int* array, size_t n)
|
||||
{
|
||||
|
|
@ -456,6 +508,57 @@ namespace spot
|
|||
unsigned int buffer_mask_;
|
||||
};
|
||||
|
||||
class int_vector_vector_decompression:
|
||||
public stream_decompression_base<int_vector_vector_decompression>
|
||||
{
|
||||
public:
|
||||
int_vector_vector_decompression(const std::vector<unsigned int>& array,
|
||||
std::vector<int>& res, size_t size)
|
||||
: prev_(0), array_(array),
|
||||
pos_(array.begin()), end_(array.end()),
|
||||
result_(res), size_(size)
|
||||
{
|
||||
result_.reserve(size);
|
||||
}
|
||||
|
||||
bool complete() const
|
||||
{
|
||||
return size_ == 0;
|
||||
}
|
||||
|
||||
void push_data(int i)
|
||||
{
|
||||
prev_ = i;
|
||||
result_.push_back(i);
|
||||
--size_;
|
||||
}
|
||||
|
||||
void repeat(unsigned int i)
|
||||
{
|
||||
size_ -= i;
|
||||
while (i--)
|
||||
result_.push_back(prev_);
|
||||
}
|
||||
|
||||
bool have_comp_data() const
|
||||
{
|
||||
return pos_ != end_;
|
||||
}
|
||||
|
||||
unsigned int next_comp_data()
|
||||
{
|
||||
return *pos_++;
|
||||
}
|
||||
|
||||
protected:
|
||||
int prev_;
|
||||
const std::vector<unsigned int>& array_;
|
||||
std::vector<unsigned int>::const_iterator pos_;
|
||||
std::vector<unsigned int>::const_iterator end_;
|
||||
std::vector<int>& result_;
|
||||
size_t size_;
|
||||
};
|
||||
|
||||
class int_vector_array_decompression:
|
||||
public stream_decompression_base<int_vector_array_decompression>
|
||||
{
|
||||
|
|
@ -559,6 +662,14 @@ namespace spot
|
|||
|
||||
}
|
||||
|
||||
void
|
||||
int_vector_vector_decompress(const std::vector<unsigned int>& input,
|
||||
std::vector<int>& output, size_t size)
|
||||
{
|
||||
int_vector_vector_decompression c(input, output, size);
|
||||
c.run();
|
||||
}
|
||||
|
||||
void
|
||||
int_vector_array_decompress(const std::vector<unsigned int>* array, int* res,
|
||||
size_t size)
|
||||
|
|
|
|||
|
|
@ -28,11 +28,24 @@ namespace spot
|
|||
/// \addtogroup misc_tools
|
||||
/// @{
|
||||
|
||||
/// Compress an int vector into a vector of unsigned int.
|
||||
void
|
||||
int_vector_vector_compress(const std::vector<int>& input,
|
||||
std::vector<unsigned int>& output);
|
||||
|
||||
/// \brief Uncompress a vector of unsigned int into a vector of
|
||||
/// size \a size.
|
||||
///
|
||||
/// \a size must be the exact expected size of uncompressed array.
|
||||
void
|
||||
int_vector_vector_decompress(const std::vector<unsigned int>& array,
|
||||
std::vector<int>& output, size_t size);
|
||||
|
||||
/// Compress an int array if size \a n into a vector of unsigned int.
|
||||
const std::vector<unsigned int>*
|
||||
int_array_vector_compress(const int* array, size_t n);
|
||||
|
||||
/// \brief Uncompress a vector of unsigned int into an int array if
|
||||
/// \brief Uncompress a vector of unsigned int into an int array of
|
||||
/// size \a size.
|
||||
///
|
||||
/// \a size must be the exact expected size of uncompressed array.
|
||||
|
|
|
|||
|
|
@ -165,7 +165,7 @@ for dir in "${INCDIR-..}" "${INCDIR-..}"/../iface; do
|
|||
egrep '(->|[.])size\(\) [=!]= 0|![a-zA-Z0-9_]*(->|[.])size\(\)|(if |while |assert)\([a-zA-Z0-9_]*(->|[.])size\(\)\)' $tmp &&
|
||||
diag 'Prefer empty() to check emptiness.'
|
||||
|
||||
egrep '^[^=]*([+][+]|--);' $tmp &&
|
||||
egrep '^[^=*]*([+][+]|--);' $tmp &&
|
||||
diag 'Take good habits: use ++i instead of i++ when you have the choice.'
|
||||
|
||||
grep '[^a-zA-Z0-9_](\*[a-zA-Z0-9_]*)\.' $tmp &&
|
||||
|
|
|
|||
|
|
@ -22,6 +22,54 @@
|
|||
#include "misc/intvcomp.hh"
|
||||
#include <cstring>
|
||||
|
||||
int check_vv(int* data, int size, unsigned expected = 0)
|
||||
{
|
||||
|
||||
std::vector<int> input;
|
||||
input.reserve(size);
|
||||
for (int i = 0; i < size; ++i)
|
||||
input.push_back(data[i]);
|
||||
|
||||
std::vector<unsigned int> output;
|
||||
spot::int_vector_vector_compress(input, output);
|
||||
|
||||
std::cout << "WC[" << output.size() << "] ";
|
||||
for (size_t i = 0; i < output.size(); ++i)
|
||||
std::cout << output[i] << " ";
|
||||
std::cout << std::endl;
|
||||
|
||||
std::vector<int> decomp;
|
||||
spot::int_vector_vector_decompress(output, decomp, size);
|
||||
|
||||
std::cout << "WD[" << decomp.size() << "] ";
|
||||
for (size_t i = 0; i < decomp.size(); ++i)
|
||||
std::cout << decomp[i] << " ";
|
||||
std::cout << std::endl;
|
||||
|
||||
int res = (decomp != input);
|
||||
|
||||
if (res)
|
||||
{
|
||||
std::cout << "*** cmp error *** " << std::endl;
|
||||
std::cout << "WE[" << size << "] ";
|
||||
for (int i = 0; i < size; ++i)
|
||||
std::cout << data[i] << " ";
|
||||
std::cout << std::endl;
|
||||
}
|
||||
|
||||
if (expected && (output.size() * sizeof(int) != expected))
|
||||
{
|
||||
std::cout << "*** size error *** (expected "
|
||||
<< expected << " bytes, got " << output.size() * sizeof(int)
|
||||
<< " bytes)" << std::endl;
|
||||
res = 1;
|
||||
}
|
||||
|
||||
std::cout << std::endl;
|
||||
|
||||
return !!res;
|
||||
}
|
||||
|
||||
int check_av(int* data, int size, unsigned expected = 0)
|
||||
{
|
||||
const std::vector<unsigned int>* v =
|
||||
|
|
@ -113,7 +161,10 @@ int check_aa(int* data, int size, unsigned expected = 0)
|
|||
|
||||
int check(int* comp, int size, unsigned expected = 0)
|
||||
{
|
||||
return check_av(comp, size, expected) + check_aa(comp, size, expected);
|
||||
return
|
||||
check_vv(comp, size, expected) +
|
||||
check_av(comp, size, expected) +
|
||||
check_aa(comp, size, expected);
|
||||
}
|
||||
|
||||
int main()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue