X-Git-Url: http://git.nguyen.vg/gitweb/?a=blobdiff_plain;f=src%2Fstatic_sequence%2Fstatic_sequence.cpp;fp=src%2Fstatic_sequence%2Fstatic_sequence.cpp;h=bd86382ad6cfb07de5a244a1dd89c74c41c51766;hb=3fd4bcef236556c7f3bff1d2be8d3f4206245501;hp=0000000000000000000000000000000000000000;hpb=dc7a566a39187bfcea70737cda7278f858cd9842;p=SXSI%2Flibcds.git diff --git a/src/static_sequence/static_sequence.cpp b/src/static_sequence/static_sequence.cpp new file mode 100644 index 0000000..bd86382 --- /dev/null +++ b/src/static_sequence/static_sequence.cpp @@ -0,0 +1,93 @@ +/* static_sequence.cpp + * Copyright (C) 2008, Francisco Claude, all rights reserved. + * + * static_sequence definition + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include +using std::max; +using std::min; +using std::cout; +using std::cin; +using std::endl; + + +static_sequence::static_sequence() {} +static_sequence::~static_sequence() {} +uint static_sequence::length() { return len; } + +uint static_sequence::count(uint s) { + return rank(s,len-1); +} + +static_sequence * static_sequence::load(FILE * fp) { + uint rd; + if(fread(&rd,sizeof(uint),1,fp)!=1) return NULL; + fseek(fp,-sizeof(uint),SEEK_CUR); + switch(rd) { + case WVTREE_HDR: return static_sequence_wvtree::load(fp); + case GMR_CHUNK_HDR: return static_sequence_gmr_chunk::load(fp); + case GMR_HDR: return static_sequence_gmr::load(fp); + case WVTREE_NOPTRS_HDR: return static_sequence_wvtree_noptrs::load(fp); + case BS_HDR: return static_sequence_bs::load(fp); + } + return NULL; +} + +uint static_sequence::select_next(uint c, uint i) { + return select(c,rank(c,i)+1); +} + +bool static_sequence::test(uint * seq, uint n) { + uint sigma = 0; + for(uint i=0;i0 && rank(seq[i],i-1)!=occ[seq[i]]-1) { + cout << "rank-1 failed!" << endl; + delete [] occ; + return false; + } + if(select(seq[i],occ[seq[i]])!=i) { + cout << "select failed!" << endl; + cout << "select(" << seq[i] << "," << occ[seq[i]] << ")="<