/* Copyright (c) 2012-2017 The ANTLR Project. All rights reserved.
 * Use of this file is governed by the BSD 3-clause license that
 * can be found in the LICENSE.txt file in the project root.
 */

#pragma once

namespace antlr4 {
namespace atn {

  class ANTLR4CPP_PUBLIC ATNSerializer {
  public:
    ATN *atn;

    ATNSerializer(ATN *atn);
    ATNSerializer(ATN *atn, const std::vector<std::string> &tokenNames);
    virtual ~ATNSerializer();

    /// <summary>
    /// Serialize state descriptors, edge descriptors, and decision->state map
    ///  into list of ints:
    ///
    /// 		grammar-type, (ANTLRParser.LEXER, ...)
    ///  	max token type,
    ///  	num states,
    ///  	state-0-type ruleIndex, state-1-type ruleIndex, ... state-i-type
    ///  ruleIndex optional-arg ...
    ///  	num rules,
    ///  	rule-1-start-state rule-1-args, rule-2-start-state  rule-2-args, ...
    ///  	(args are token type,actionIndex in lexer else 0,0)
    ///      num modes,
    ///      mode-0-start-state, mode-1-start-state, ... (parser has 0 modes)
    ///      num sets
    ///      set-0-interval-count intervals, set-1-interval-count intervals, ...
    ///  	num total edges,
    ///      src, trg, edge-type, edge arg1, optional edge arg2 (present always),
    ///      ...
    ///      num decisions,
    ///      decision-0-start-state, decision-1-start-state, ...
    ///
    ///  Convenient to pack into unsigned shorts to make as Java string.
    /// </summary>
    virtual std::vector<size_t> serialize();

    virtual std::string decode(const std::wstring& data);
    virtual std::string getTokenName(size_t t);

    /// Used by Java target to encode short/int array as chars in string.
    static std::wstring getSerializedAsString(ATN *atn);
    static std::vector<size_t> getSerialized(ATN *atn);

    static std::string getDecoded(ATN *atn, std::vector<std::string> &tokenNames);

  private:
    std::vector<std::string> _tokenNames;

    void serializeUUID(std::vector<size_t> &data, antlrcpp::Guid uuid);
  };

} // namespace atn
} // namespace antlr4
