#include "progress.h"

namespace marisa_alpha {

Progress::Progress(int flags) : flags_(flags), trie_id_(0), total_size_(0) {
  if ((flags_ & MARISA_ALPHA_NUM_TRIES_MASK) == 0) {
    flags_ = (flags_ & ~MARISA_ALPHA_NUM_TRIES_MASK)
        | MARISA_ALPHA_DEFAULT_NUM_TRIES;
  }
  if ((flags & MARISA_ALPHA_TRIE_MASK) == 0) {
    flags_ = (flags_ & ~MARISA_ALPHA_TRIE_MASK) | MARISA_ALPHA_DEFAULT_TRIE;
  }
  if ((flags & MARISA_ALPHA_TAIL_MASK) == 0) {
    flags_ = (flags_ & ~MARISA_ALPHA_TAIL_MASK) | MARISA_ALPHA_DEFAULT_TAIL;
  }
  if ((flags & MARISA_ALPHA_ORDER_MASK) == 0) {
    flags_ = (flags_ & ~MARISA_ALPHA_ORDER_MASK) | MARISA_ALPHA_DEFAULT_ORDER;
  }
}

bool Progress::is_valid() const {
  if ((flags_ & ~MARISA_ALPHA_FLAGS_MASK) != 0) {
    return false;
  }
  switch (flags_ & MARISA_ALPHA_TRIE_MASK) {
    case MARISA_ALPHA_PATRICIA_TRIE:
    case MARISA_ALPHA_PREFIX_TRIE: {
      break;
    }
    default: {
      return false;
    }
  }
  switch (flags_ & MARISA_ALPHA_TAIL_MASK) {
    case MARISA_ALPHA_WITHOUT_TAIL:
    case MARISA_ALPHA_BINARY_TAIL:
    case MARISA_ALPHA_TEXT_TAIL: {
      break;
    }
    default: {
      return false;
    }
  }
  switch (flags_ & MARISA_ALPHA_ORDER_MASK) {
    case MARISA_ALPHA_LABEL_ORDER:
    case MARISA_ALPHA_WEIGHT_ORDER: {
      break;
    }
    default: {
      return false;
    }
  }
  return true;
}

}  // namespace marisa_alpha