/*
 * Copyright (C) 2013 Apple Inc. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
 */

#ifndef JSArrayBufferViewInlines_h
#define JSArrayBufferViewInlines_h

#include "ArrayBufferView.h"
#include "JSArrayBufferView.h"
#include "JSDataView.h"

namespace JSC {

inline ArrayBuffer* JSArrayBufferView::buffer()
{
    switch (m_mode) {
    case WastefulTypedArray:
        return existingBufferInButterfly();
    case DataViewMode:
        return jsCast<JSDataView*>(this)->buffer();
    default:
        return methodTable()->slowDownAndWasteMemory(this);
    }
}

inline ArrayBuffer* JSArrayBufferView::existingBufferInButterfly()
{
    ASSERT(m_mode == WastefulTypedArray);
    return butterfly()->indexingHeader()->arrayBuffer();
}

inline PassRefPtr<ArrayBufferView> JSArrayBufferView::impl()
{
    return methodTable()->getTypedArrayImpl(this);
}

inline void JSArrayBufferView::neuter()
{
    ASSERT(hasArrayBuffer());
    m_length = 0;
    m_vector.clear();
}

inline unsigned JSArrayBufferView::byteOffset()
{
    if (!hasArrayBuffer())
        return 0;

    ASSERT(!vector() == !buffer()->data());

    ptrdiff_t delta =
        bitwise_cast<uint8_t*>(vector()) - static_cast<uint8_t*>(buffer()->data());
    
    unsigned result = static_cast<unsigned>(delta);
    ASSERT(static_cast<ptrdiff_t>(result) == delta);
    return result;
}

} // namespace JSC

#endif // JSArrayBufferViewInlines_h

