/*
    TCFbEToolkit.h    June 6, 2004.

    Copyright (C) 2003-2004 CFbE Research Group,
    Software Engineering Laboratory,
    Graduate School of Information Science,
    Nara Institute of Science and Technology,
    All rights reserved.

    This program is free software; you can redistribute it and/or modify it
    under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2, (at your option) or
    any later version.

    This program 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 for more details.

    You should have received a copy of the GNU General Public License
    along with GNU Emacs; see the file COPYING.  If not, write to the
    Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.
*/
//---------------------------------------------------------------------------
#ifndef TCFbEToolkitH
#define TCFbEToolkitH
//---------------------------------------------------------------------------
#include <ComCtrls.hpp>
#include <math.h>
#include <system.hpp>
//---------------------------------------------------------------------------
enum TSortDirection { sdAscending, sdDescending };
//---------------------------------------------------------------------------
struct TVersion {
    unsigned int    Major;    // メジャーバージョン
    unsigned int    Minor;    // マイナーバージョン
    unsigned int    Revision;    // リビジョン
    unsigned int    Build;    // ビルド
    AnsiString    VersionString;
};

//---------------------------------------------------------------------------
// プログラム全体で使用するグローバルな関数や定数，変数を含むクラス
class TCFbEToolkit: public TObject
{
public:
    __fastcall ~TCFbEToolkit();                                                        // デストラクタ（必ずアプリケーションのデストラクタで開放すること

    static TCFbEToolkit* __fastcall GetToolkit();                                    // ファクトリメソッド，シングルトンとして実装TCFbEToolkitを得たいときはこのメソッドを叩く
    static void __fastcall DeleteToolkit();                                            // ツールキットを解放する

    virtual void __fastcall CopyList(TList* SourceList, TList* DestinationList);    // TList型のコピー

    virtual bool __fastcall Equals(TFont* Font0, TFont* Font1);                        // Font0 と Font1 のフォント属性が等しければ true を等しくなければ false を返します．
    virtual bool __fastcall Equals(double Value0, double Value1, double ErrorRange=1E-6);    // Value0 と Value1 を比較する．誤差が ErrorRange 以下なら等しいとする

    virtual void __fastcall DebugOutput(AnsiString OutputString);    // アプリケーションが存在するディレクトリにデバッグファイル（"debug.txt"）を出力する

    virtual void __fastcall SetApplicationPriority(TThreadPriority Priority);        // アプリケーションのプライオリティを変更

    virtual void __fastcall SortDoubleDynArray(TDoubleDynArray& DynArray, TSortDirection Direction=sdDescending);    // DynArray をソートする
    virtual double __fastcall GetAverageOfDynArray(TDoubleDynArray& DynArray);    // DynArray の要素の平均値を返す
    virtual double __fastcall GetMedianOfDynArray(TDoubleDynArray& DynArray);    // DynArray の要素の中間値を返す（DynArray はソートされている必要がある

    virtual void __fastcall CsvToStrings(AnsiString str,TStrings *List);    // CSV形式の文字列をTStringsに分解する
    virtual void __fastcall Exchange(TDoubleDynArray& Array, int Index1, int Index2);    // Array の Index1 と Index2 の要素を入替える

protected:
    virtual __fastcall TCFbEToolkit();    // コンストラクタ
    virtual bool __fastcall IsQuote(char c) { return (c=='\"' || c=='\''); }    // CsvToStrings メソッドで使う
    virtual bool __fastcall IsDelimiter(char c) { return (c==','); }    // CsvToStrings メソッドで使うマクロ

    static TCFbEToolkit* Instance;    // インスタンス

    TStringList* DebugStringList;    // debug.txt を出力するための文字列リスト

private:
};
TCFbEToolkit* TCFbEToolkit::Instance = NULL;    // TCFbEToolkitの実体

//---------------------------------------------------------------------------
#endif
