/*
 * Copyright (C) 2015 Yusuke Suzuki <utatane.tea@gmail.com>.
 * Copyright (C) 2016 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. AND ITS CONTRIBUTORS ``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 ITS 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.
 */

#pragma once

#include <initializer_list>

namespace JSC {

// macro(name, isEnabledFlag)
#define JSC_RUNTIME_FLAG(macro)

class RuntimeFlags {
private:
    enum RuntimeFlagShiftValue : unsigned {
#define JSC_DECLARE_RUNTIME_FLAG_SHIFT_VALUE(name, isEnabledFlag) shiftValueFor##name,
        JSC_RUNTIME_FLAG(JSC_DECLARE_RUNTIME_FLAG_SHIFT_VALUE)
#undef JSC_DECLARE_RUNTIME_FLAG_SHIFT_VALUE
    };

public:
    enum RuntimeFlag : unsigned {
#define JSC_DECLARE_RUNTIME_FLAG(name, isEnabledFlag) name = 1u << (shiftValueFor##name),
        JSC_RUNTIME_FLAG(JSC_DECLARE_RUNTIME_FLAG)
#undef JSC_DECLARE_RUNTIME_FLAG
    };

#define JSC_DECLARE_RUNTIME_FLAG_ACCESSOR(name, isEnabledFlag) \
    void set##name(bool value)\
    {\
        if (value)\
            m_flags |= name;\
        else\
            m_flags &= (~name);\
    }\
    bool is##name() const\
    {\
        return m_flags & name;\
    }
    JSC_RUNTIME_FLAG(JSC_DECLARE_RUNTIME_FLAG_ACCESSOR)
#undef JSC_DECLARE_RUNTIME_FLAG_ACCESSOR

    RuntimeFlags()
        : RuntimeFlags(0u)
    {
    }

    RuntimeFlags(std::initializer_list<RuntimeFlag> initializerList)
        : RuntimeFlags()
    {
        for (RuntimeFlag flag : initializerList)
            m_flags |= flag;
    }

    explicit RuntimeFlags(unsigned flags)
        : m_flags(flags)
    {
    }

    static RuntimeFlags createAllEnabled()
    {
        return RuntimeFlags(
#define JSC_USE_RUNTIME_FLAG(name, isEnabledFlag) ((isEnabledFlag) ? name : 0u) |
            JSC_RUNTIME_FLAG(JSC_USE_RUNTIME_FLAG)
#undef JSC_USE_RUNTIME_FLAG
            0u
        );
    }

private:
    unsigned m_flags;
};

} // namespace JSC
