/*
 * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */
package org.graalvm.compiler.hotspot.stubs;

import java.util.concurrent.atomic.AtomicLong;

import org.graalvm.compiler.core.common.CompilationIdentifier;
import org.graalvm.compiler.debug.GraalError;

/**
 * {@link CompilationIdentifier} for {@linkplain Stub stub compilations}.
 */
public class StubCompilationIdentifier implements CompilationIdentifier {

    private static final AtomicLong uniqueStubIds = new AtomicLong();
    private final long id;
    private final Stub stub;

    public StubCompilationIdentifier(Stub stub) {
        this.id = uniqueStubIds.getAndIncrement();
        this.stub = stub;
    }

    @Override
    public final String toString() {
        return toString(Verbosity.DETAILED);
    }

    @Override
    public String toString(Verbosity verbosity) {
        switch (verbosity) {
            case ID:
                return buildID();
            case NAME:
                return buildName();
            case DETAILED:
                return buildID() + '[' + buildName() + ']';
        }
        throw new GraalError("unknown verbosity: " + verbosity);
    }

    private String buildName() {
        return stub.toString();
    }

    private String buildID() {
        return "StubCompilation-" + id;
    }

}
