// Copyright 2017 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.

#include "components/zucchini/encoded_view.h"

#include <algorithm>
#include <utility>

#include "base/logging.h"

namespace zucchini {

EncodedView::EncodedView(const ImageIndex& image_index)
    : image_index_(image_index), pool_infos_(image_index.PoolCount()) {}
EncodedView::~EncodedView() = default;

EncodedView::value_type EncodedView::Projection(offset_t location) const {
  DCHECK_LT(location, image_index_.size());

  // Find out what lies at |location|.
  TypeTag type = image_index_.LookupType(location);

  // |location| points into raw data.
  if (type == kNoTypeTag) {
    // The projection is the identity function on raw content.
    return image_index_.GetRawValue(location);
  }

  // |location| points into a Reference.
  const ReferenceSet& ref_set = image_index_.refs(type);
  IndirectReference ref = ref_set.at(location);
  DCHECK_GE(location, ref.location);
  DCHECK_LT(location, ref.location + ref_set.width());

  // |location| is not the first byte of the reference.
  if (location != ref.location) {
    // Trailing bytes of a reference are all projected to the same value.
    return kReferencePaddingProjection;
  }

  PoolTag pool_tag = ref_set.pool_tag();

  // Targets with an associated Label will use its Label index in projection.
  DCHECK_EQ(image_index_.pool(pool_tag).size(),
            pool_infos_[pool_tag.value()].labels.size());
  uint32_t label = pool_infos_[pool_tag.value()].labels[ref.target_key];

  // Projection is done on (|target|, |type|), shifted by
  // kBaseReferenceProjection to avoid collisions with raw content.
  value_type projection = label;
  projection *= image_index_.TypeCount();
  projection += type.value();
  return projection + kBaseReferenceProjection;
}

size_t EncodedView::Cardinality() const {
  size_t max_width = 0;
  for (const auto& pool_info : pool_infos_)
    max_width = std::max(max_width, pool_info.bound);
  return max_width * image_index_.TypeCount() + kBaseReferenceProjection;
}

void EncodedView::SetLabels(PoolTag pool,
                            std::vector<uint32_t>&& labels,
                            size_t bound) {
  DCHECK_EQ(labels.size(), image_index_.pool(pool).size());
  DCHECK(labels.empty() || *max_element(labels.begin(), labels.end()) < bound);
  pool_infos_[pool.value()].labels = std::move(labels);
  pool_infos_[pool.value()].bound = bound;
}

EncodedView::PoolInfo::PoolInfo() = default;
EncodedView::PoolInfo::PoolInfo(PoolInfo&&) = default;
EncodedView::PoolInfo::~PoolInfo() = default;

}  // namespace zucchini
