namespace EE::UI::Doc

namespace Doc {

// typedefs

typedef String::HashType SyntaxStyleType;
typedef Uint32 SyntaxTokenLen;
typedef std::deque<TextUndoCommand*> UndoStackContainer;

// enums

enum FoldRangeType;
enum LineWrapMode;
enum LineWrapType;
enum TextUndoCommandType;
enum VisibleIndex;

// structs

struct DocumentContentChange;
struct SyntaxPattern;
struct SyntaxState;
struct SyntaxStateRestored;
struct SyntaxToken;
struct SyntaxTokenComplete;
struct SyntaxTokenPosition;
struct TextSearchParams;
struct TokenizedLine;

// classes

class DocumentView;
class FoldRangeServive;
class SyntaxColorScheme;
class SyntaxDefinition;
class SyntaxDefinitionManager;
class SyntaxHighlighter;
class SyntaxStyleTypes;
class SyntaxTokenizer;
class TextDocument;
class TextDocumentLine;
class TextFormat;
class TextPosition;
class TextRange;
class TextRanges;
class TextUndoCommand;
class TextUndoCommandInsert;
class TextUndoCommandRemove;
class TextUndoCommandSelection;
class TextUndoStack;

// global functions

VisibleIndex visibleIndexOffset(VisibleIndex idx, Int64 offset);
constexpr auto operator""_sst(const char* s, std::size_t);

template <typename Type>
constexpr auto SyntaxStyleTypeHash(const Type& type);

template <typename T>
static auto toSyntaxStyleType(const T& s);

constexpr auto SyntaxStyleEmpty();

template <typename T>
static auto toSyntaxStyleTypeV(const std::vector<T>& s);

} // namespace Doc