Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions extras/tests/scripts/testPackedArray.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
#!/usr/bin/env bash
set -euo pipefail

repo_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../.." && pwd)"
build_dir="$(mktemp -d)"
trap 'rm -rf "${build_dir}"' EXIT

"${CXX:-g++}" \
-std=c++11 -Wall -Wextra -fsanitize=address,undefined \
-I"${repo_dir}/source" \
"${repo_dir}/extras/tests/testPackedArray.cpp" \
"${repo_dir}/source/PackedArray.cpp" \
-o "${build_dir}/testPackedArray"

ASAN_OPTIONS=detect_leaks=0 "${build_dir}/testPackedArray"
35 changes: 35 additions & 0 deletions extras/tests/testPackedArray.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
#include "PackedArray.h"

#include <iostream>
#include <vector>

int main()
{
const uint bits=13;
const uint count=257;
const uint mask=(1LLU<<bits)-1;

PackedArray packed;
packed.defineBits(bits, count);

std::vector<char> storage(packed.lengthByte+1, 0);
packed.pointArray(storage.data()+1);

for (uint ii=0; ii<count; ii++)
{
packed.writePacked(ii, (ii*7919+17)&mask);
};

for (uint ii=0; ii<count; ii++)
{
uint expected=(ii*7919+17)&mask;
if (packed[ii]!=expected)
{
std::cerr << "packed value mismatch at " << ii << ": expected "
<< expected << ", observed " << packed[ii] << '\n';
return 1;
};
};

return 0;
}
8 changes: 4 additions & 4 deletions source/Genome_genomeGenerate.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,17 +28,17 @@ uint globalL;

inline int funCompareSuffixes ( const void *a, const void *b){

uint *ga=(uint*)((globalG-7LLU)+(*((uint*)a)));
uint *gb=(uint*)((globalG-7LLU)+(*((uint*)b)));
const char *ga=(globalG-7LLU)+(*((uint*)a));
const char *gb=(globalG-7LLU)+(*((uint*)b));

uint jj=0;
int ii=0;
uint va=0,vb=0;
uint8 *va1, *vb1;

while (jj < globalL) {
va=*(ga-jj);
vb=*(gb-jj);
memcpy(&va, ga-jj*sizeof(uint), sizeof(va));
memcpy(&vb, gb-jj*sizeof(uint), sizeof(vb));

#define has5(v) ((((v)^0x0505050505050505) - 0x0101010101010101) & ~((v)^0x0505050505050505) & 0x8080808080808080)

Expand Down
6 changes: 4 additions & 2 deletions source/PackedArray.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,10 @@ void PackedArray::writePacked( uint jj, uint x) {
uint S=b%8LLU;

x = x << S;
uint* a1 = (uint*) (charArray+B);
*a1 = ( (*a1) & ~(bitRecMask<<S) ) | x;
uint a1;
memcpy(&a1, charArray+B, sizeof(a1));
a1 = (a1 & ~(bitRecMask<<S)) | x;
memcpy(charArray+B, &a1, sizeof(a1));
};

void PackedArray::pointArray(char* pointerCharIn) {
Expand Down
3 changes: 2 additions & 1 deletion source/PackedArray.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,8 @@ inline uint PackedArray::operator [] (uint ii) {
uint B=b/8;
uint S=b%8;

uint a1 = *((uint*) (charArray+B));
uint a1;
memcpy(&a1, charArray+B, sizeof(a1));
a1 = ((a1>>S)<<wordCompLength)>>wordCompLength;
return a1;
};
Expand Down
6 changes: 4 additions & 2 deletions source/SuffixArrayFuns.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -359,7 +359,8 @@ uint funCalcSAiFromSA(char* gSeq, PackedArray& gSA, Genome &mapGen, uint iSA, in
register uint saind=0;
if (dirG)
{
register uint128 g1=*( (uint128*) (gSeq+SAstr) );
register uint128 g1;
memcpy(&g1, gSeq+SAstr, sizeof(g1));
for (int ii=0; ii<L; ii++)
{
register char g2=(char) g1;
Expand All @@ -376,7 +377,8 @@ uint funCalcSAiFromSA(char* gSeq, PackedArray& gSA, Genome &mapGen, uint iSA, in
return saind;
} else
{
register uint128 g1=*( (uint128*) (gSeq+mapGen.nGenome-SAstr-16) );
register uint128 g1;
memcpy(&g1, gSeq+mapGen.nGenome-SAstr-16, sizeof(g1));
for (int ii=0; ii<L; ii++)
{
register char g2=(char) (g1>>(8*(15-ii)));
Expand Down