-
Adam Knapp authored
Change-Id: Iacba53d8499439eba82045c30a1e0f2e0edf16fe Signed-off-by:
Adam Knapp <adam.knapp@sigmatechnology.se>
Adam Knapp authoredChange-Id: Iacba53d8499439eba82045c30a1e0f2e0edf16fe Signed-off-by:
Adam Knapp <adam.knapp@sigmatechnology.se>
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
CodeGenHelper.hh 3.07 KiB
/******************************************************************************
* Copyright (c) 2000-2021 Ericsson Telecom AB
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html
*
* Contributors:
* Balasko, Jeno
* Raduly, Csaba
* Szabo, Bence Janos
* Zalanyi, Balazs Andor
*
******************************************************************************/
#ifndef _Common_CodeGenHelper_HH
#define _Common_CodeGenHelper_HH
#include "ttcn3/compiler.h"
#include "map.hh"
#include "vector.hh"
#include "string.hh"
#include "ttcn3/AST_ttcn3.hh"
#include "Type.hh"
namespace Ttcn {
class Definition;
}
namespace Common {
class CodeGenHelper {
public:
enum split_type {
SPLIT_NONE, ///< original code generation
SPLIT_BY_KIND, ///< place different kind of types in their own file
SPLIT_BY_NAME, ///< place all definitions/assignments in their own file
SPLIT_BY_HEURISTICS,///< heuristic function will decide the structure
SPLIT_TO_SLICES ///< split large files into smaller ones
};
private:
struct generated_output_t {
generated_output_t();
~generated_output_t();
output_struct os;
string modulename;
string module_dispname;
string filename;
bool is_module;
bool is_ttcn;
bool has_circular_import;
};
static const char* const typetypemap[];
typedef map<string, generated_output_t> output_map_t;
output_map_t generated_code;
split_type split_mode;
unsigned int slice_num;
struct module_names_t {
string name;
string dispname;
};
vector<module_names_t> modules;
string current_module;
static CodeGenHelper* instance;
public:
CodeGenHelper();
static CodeGenHelper& GetInstance();
void set_split_mode(split_type st);
bool set_split_mode(const char* type);
split_type get_split_mode() const;
void add_module(const string& name, const string& dispname, bool is_ttcn,
bool has_circular_import);
output_struct* get_outputstruct(const string& name);
output_struct* get_outputstruct(Ttcn::Definition* def);
output_struct* get_outputstruct(Type* type);
output_struct* get_current_outputstruct();
void finalize_generation(Type* type);
void set_current_module(const string& name);
static void update_intervals(output_struct* const output);
size_t size_of_sources(output_struct * const output);
size_t get_next_chunk_pos(const output_struct * const from, output_struct * const to, const size_t base_pos, const size_t chunk_size);
void get_chunk_from_poslist(const char* from, char *& to, const size_t interval_array[], const size_t interval_array_size, const size_t base_pos, const size_t chunk_size, size_t& pos);
void write_output();
~CodeGenHelper();
private:
string get_key(Ttcn::Definition& def) const;
string get_key(Type& type) const;
static void transfer_value(char* &dst, char* &src);
};
}
#endif /* _Common_CodeGenHelper_HH */