// Copyright 2016 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

#include "core/fpdfapi/parser/cpdf_number.h"

#include "core/fxcrt/fx_stream.h"

CPDF_Number::CPDF_Number() = default;

CPDF_Number::CPDF_Number(int value) : m_Number(value) {}

CPDF_Number::CPDF_Number(float value) : m_Number(value) {}

CPDF_Number::CPDF_Number(ByteStringView str) : m_Number(str) {}

CPDF_Number::~CPDF_Number() = default;

CPDF_Object::Type CPDF_Number::GetType() const {
  return kNumber;
}

RetainPtr<CPDF_Object> CPDF_Number::Clone() const {
  return m_Number.IsInteger()
             ? pdfium::MakeRetain<CPDF_Number>(m_Number.GetSigned())
             : pdfium::MakeRetain<CPDF_Number>(m_Number.GetFloat());
}

float CPDF_Number::GetNumber() const {
  return m_Number.GetFloat();
}

int CPDF_Number::GetInteger() const {
  return m_Number.GetSigned();
}

bool CPDF_Number::IsNumber() const {
  return true;
}

CPDF_Number* CPDF_Number::AsNumber() {
  return this;
}

const CPDF_Number* CPDF_Number::AsNumber() const {
  return this;
}

void CPDF_Number::SetString(const ByteString& str) {
  m_Number = FX_Number(str.AsStringView());
}

ByteString CPDF_Number::GetString() const {
  return m_Number.IsInteger() ? ByteString::FormatInteger(m_Number.GetSigned())
                              : ByteString::FormatFloat(m_Number.GetFloat());
}

bool CPDF_Number::WriteTo(IFX_ArchiveStream* archive,
                          const CPDF_Encryptor* encryptor) const {
  return archive->WriteString(" ") &&
         archive->WriteString(GetString().AsStringView());
}
