// Copyright 2014 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
// Original code is licensed as follows:
/*
 * Copyright 2013 ZXing authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "../barcode.h"
#include "BC_PDF417Common.h"
#include "BC_PDF417BarcodeValue.h"
CBC_BarcodeValue::CBC_BarcodeValue()
{
}
CBC_BarcodeValue::~CBC_BarcodeValue()
{
}
void CBC_BarcodeValue::setValue(int32_t value)
{
    int32_t confidence = 0;
    for (int32_t i = 0; i < m_keys.GetSize(); i++) {
        if (m_keys.GetAt(i) == value) {
            confidence = m_values.GetAt(i);
            m_values.SetAt(i, confidence + 1);
            return;
        }
    }
    confidence = 1;
    m_keys.Add(value);
    m_values.Add(confidence);
}
CFX_Int32Array* CBC_BarcodeValue::getValue()
{
    int32_t maxConfidence = -1;
    CFX_Int32Array* result = FX_NEW CFX_Int32Array;
    for (int32_t i = 0; i < m_keys.GetSize(); i++) {
        if (m_values.GetAt(i) > maxConfidence) {
            maxConfidence = m_values.GetAt(i);
            result->RemoveAll();
            result->Add(m_keys.GetAt(i));
        } else if (m_values.GetAt(i) == maxConfidence) {
            result->Add(m_keys.GetAt(i));
        }
    }
    return result;
}
int32_t CBC_BarcodeValue::getConfidence(int32_t value)
{
    for (int32_t i = 0; i < m_keys.GetSize(); i++)
        if (m_keys.GetAt(i) == value) {
            return m_values.GetAt(i);
        }
    return -1;
}
