// Copyright 2014 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 "sky/engine/config.h"
#include "sky/engine/wtf/ArrayPiece.h"

#include "sky/engine/wtf/ArrayBuffer.h"
#include "sky/engine/wtf/ArrayBufferView.h"
#include "sky/engine/wtf/Assertions.h"

namespace WTF {

ArrayPiece::ArrayPiece()
{
    initNull();
}

ArrayPiece::ArrayPiece(void* data, unsigned byteLength)
{
    initWithData(data, byteLength);
}

ArrayPiece::ArrayPiece(ArrayBuffer* buffer)
{
    if (buffer) {
        initWithData(buffer->data(), buffer->byteLength());
    } else {
        initNull();
    }
}

ArrayPiece::ArrayPiece(ArrayBufferView* buffer)
{
    if (buffer) {
        initWithData(buffer->baseAddress(), buffer->byteLength());
    } else {
        initNull();
    }
}

bool ArrayPiece::isNull() const
{
    return m_isNull;
}

void* ArrayPiece::data() const
{
    ASSERT(!isNull());
    return m_data;
}

unsigned char* ArrayPiece::bytes() const
{
    return static_cast<unsigned char*>(data());
}

unsigned ArrayPiece::byteLength() const
{
    ASSERT(!isNull());
    return m_byteLength;
}

void ArrayPiece::initWithData(void* data, unsigned byteLength)
{
    m_byteLength = byteLength;
    m_data = data;
    m_isNull = false;
}

void ArrayPiece::initNull()
{
    m_byteLength = 0;
    m_data = 0;
    m_isNull = true;
}

} // namespace WTF
