blob: d2942df76bc7cfcb28078c48e2085c0910dabb1d [file] [log] [blame]
// Copyright (c) 2006-2009 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Remember a subset of a sequence of values, using a modest amount of memory
#ifndef ENCODINGS_COMPACT_LANG_DET_SUBSETSEQUENCE_H_
#define ENCODINGS_COMPACT_LANG_DET_SUBSETSEQUENCE_H_
#include "encodings/compact_lang_det/win/cld_basictypes.h"
#include "encodings/compact_lang_det/win/cld_google.h"
class SubsetSequence {
public:
void Init();
void Add(uint8 e);
void Extract(int n, uint8* dst);
SubsetSequence() {Init();}
~SubsetSequence() {};
private:
uint8 Median3(int sub);
void NewLevel();
void DoCarries();
void Flush();
static const int kMaxLevel_ = 16; // 3**16 ~= 43M (3**20 ~= 3.4B)
static const int kMaxSeq_ = 128;
int k_;
int next_e_;
int limit_e_;
int level_limit_e_;
uint8 seq_[kMaxSeq_];
uint8 count_[kMaxLevel_ + 1]; // +1 allows graceful overflow
DISALLOW_EVIL_CONSTRUCTORS(SubsetSequence);
// Require enough room to end up with 40 entries plus carrying space
COMPILE_ASSERT(kMaxSeq_ >= (kMaxLevel_ * 2 + 40), kMaxSeq__is_too_small);
};
#endif // ENCODINGS_COMPACT_LANG_DET_SUBSETSEQUENCE_H_