Sqratの各クラスについて説明しています。
Sqratの概要および導入については別ページを参照してください。
Object
クラス … Sqratオブジェクトの基底クラス †
解説 †
Object
クラスは、以降に説明する次のクラスの基底クラスです。
自身のラップ対象となる HSQOBJECT
インスタンスを保持しており、オブジェクトに共通する操作をサポートします。
当然ながら、このクラスを継承しているクラスのインスタンスにおいても後述する公開メンバ関数を使うことができます。
公開メンバ関数一覧 †
- コンストラクタ
| Object();
Object(HSQOBJECT o, HSQUIRRELVM v = DefaultVM::Get());
Object(const Object& so);
|
通常、直接このクラスのコンストラクタを呼び出すことはありません。
Cast<T>
| template<class T> T Cast() const;
|
自身をテンプレート引数 T
で指定したC++型として取得します。
T
には、 int
等の基本型の他、あらかじめバインドしたクラス型等も指定できます。
GetInstanceUP
| SQUserPointer GetInstanceUP(SQUserPointer tag = NULL) const;
|
自身に対してSquirrel API関数 sq_getinstanceup
を呼び出し、得られたユーザポインタを取得します。
引数 tag
に型チェックを行うべき型を渡せますが、結果は見ていないようです。
GetObject
| virtual HSQOBJECT GetObject() const;
virtual HSQOBJECT& GetObject();
|
自身のラップ対象であるオブジェクトを取得します。
GetSlot
| Object GetSlot(const SQChar* slot) const;
|
自身が保持する、指定した名前の変数の値を取得します。
詳しくは概要と導入の『変数の値の取得』の項を参照してください。
GetType
| SQObjectType GetType() const;
|
自身のSquirrel型を取得します。
GetVM
| HSQUIRRELVM& GetVM();
HSQUIRRELVM GetVM() const;
|
自身を保持しているVMを取得します。
IsNull
-
自身が
null
値であるならば true
、そうでなければ false
を返します。
Release
-
自身の参照カウントをデクリメントします。
通常、直接呼び出す必要はありません。
Script
クラス … スクリプトのコンパイルと実行 †
解説 †
Script
クラスでは、Squirrelスクリプトのコンパイル、実行、およびバイトコードの保存を行うことができます。
コーディング例を次に示します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| -
!
-
!
-
|
|
!
-
-
!
!
| Script scriptA(vm);
scriptA.CompileString(_SC("print(\"Hello, Sqrat World.\\n\");"));
scriptA.Run();
Script scriptB(vm);
try
{
scriptB.CompileFile(_SC("test.nut"));
scriptB.WriteCompiledFile(_SC("test.cnut"));
}
catch (const Exception& ex)
{
printfunc(vm, _SC("%s\n"), ex.Message().data());
}
|
公開メンバ関数一覧 †
- 継承元
- コンストラクタ
| Script(HSQUIRRELVM v = DefaultVM::Get());
|
CompileFile
| void CompileFile(const Sqrat::string& path);
|
引数 path
で指定されたパスにあるファイルをSquirrelスクリプトとしてコンパイルします。
コンパイルに失敗した場合は Sqrat::Exception インスタンスを例外としてスローします。
CompileString
| void CompileString(const Sqrat::string& script);
|
引数 script
に渡された文字列をSquirrelスクリプトとしてコンパイルします。
コンパイルに失敗した場合は Sqrat::Exception インスタンスを例外としてスローします。
Run
-
コンパイルしたSquirrelスクリプトを実行します。
まだコンパイルしていない場合は何も行いません。
実行に失敗した場合は Sqrat::Exception インスタンスを例外としてスローします。
WriteCompiledFile
| void WriteCompiledFile(const Sqrat::string& path);
|
コンパイルしたSquirrelスクリプトのバイトコードを、引数 path
で指定されたパスのファイルに保存します。
まだコンパイルしていない場合は何も行いません。
保存されたファイルは、テキストのスクリプトファイルと同様に CompileFile
メンバ関数に渡すことができます。
RootTable
クラス、 Table
クラス … テーブルの定義 †
解説 †
RootTable
クラスは、文字通りルートテーブルを表します。
ルートテーブルは、C++でいうグローバル名前空間のようなものと考えるとわかりやすいです。
Table
クラスは、テーブルを表します。
C++でいう名前空間のようなものと考えるとわかりやすいです。
基本的にはルートテーブルもしくは他のテーブルにバインドして用います。
この2クラスはどちらも TableBase
クラスを継承しています。
両者の違いはコンストラクタでの処理のみです。
テーブル作成のC++コーディング例を次に示します。
1
2
3
4
5
6
7
8
|
-
!
-
!
| Table tableA(vm);
Table tableB(vm);
tableA.Bind("B", tableB);
RootTable(vm).Bind("A", tableA);
|
上記のコードは、次のSquirrelスクリプトと同義です。
公開メンバ関数一覧 †
- 継承元
- コンストラクタ
| RootTable(HSQUIRRELVM v = DefaultVM::Get());
Table(HSQUIRRELVM v = DefaultVM::Get());
|
Bind
| void Bind(const SQChar* name, Object& obj);
|
テーブル定義またはクラス定義 obj
をこのテーブルに name
で指定した名前でバインドします。
詳しくは概要と導入の『クラスやテーブルのバインド』の項を参照してください。
Func
| template<class F> TableBase& Func(const SQChar* name, F method);
|
C/C++関数 method
をこのテーブルに name
という名前でバインドします。
詳しくは概要と導入の『クラスやテーブルのバインド』の項を参照してください。
GetFunction
| Function GetFunction(const SQChar* name);
|
このテーブル内にあるSquirrel関数を取得します。
詳しくは概要と導入の『関数の取得と実行』の項を参照してください。
Overload
| template<class F> TableBase& Overload(const SQChar* name, F method);
|
C++のオーバーロード関数 method
をこのテーブルに name
という名前でバインドします。
基本的な使い方は Func
メンバ関数と同じですが、オーバーロード関数を定義したい場合はこちらを用います。
なお、登録できるオーバーロード関数は引数の数が異なるもののみです(引数の型が異なるだけだと上書きされます)。
Func
メンバ関数を用いる場合と比べ、呼び出し時にラッパー関数を通す分だけ若干のオーバーヘッドがあります。
SetInstance
| template<class V> TableBase& SetInstance(const SQChar* name, V* val);
|
name
で指定した名前のSquirrel変数を作成し、インスタンス val
をバインドします。
既に変数が存在する場合は上書きされます。
基本的には、あらかじめバインドしたクラス型のインスタンスを渡します。
ここで渡したインスタンスがSquirrel側で操作されると、C++側にも変更が反映されます。
詳しくは概要と導入の『変数への値のバインド』の項を参照してください。
SetValue
| template<class V> TableBase& SetValue(const SQChar* name, const V& val);
|
name
で指定した名前のSquirrel変数を作成し、値 val
をバインドします。
既に変数が存在する場合は上書きされます。
値には基本型の他、あらかじめバインドしたクラス型も用いることができます(ただしコピー可能である必要があります)。
ここで渡した値はコピーされるため、Squirrel側で操作してもC++側には影響を及ぼしません。
詳しくは概要と導入の『変数への値のバインド』の項を参照してください。
SquirrelFunc
| TableBase& SquirrelFunc(const SQChar* name, SQFUNCTION func);
|
Squirrel用関数 func
をこのテーブルに name
で指定した名前でバインドします。
C/C++関数をバインドしたい場合は Func
メンバ関数を用いてください。
Class<C,A>
クラス … クラスの定義 †
解説 †
C++クラスをSquirrelにバインドするためのクラスです。
コーディング例を次に示します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
| -
!
-
|
|
|
-
!
|
-
!
|
|
-
!
|
|
|
!
-
!
-
|
|
|
|
|
|
|
|
|
!
| class Sample
{
public:
Sample() : _text(_SC("")), _num(1) {}
int mulNum(int value) { return (value * _num); }
int getNum() const { return _num; }
void setNum(const int& num) { _num = num; }
Sqrat::string _text;
private:
int _num;
};
void bindSampleClass(HSQUIRRELVM vm)
{
using namespace Sqrat;
RootTable(vm).Bind(
_SC("Sample"),
Class<Sample>(vm)
.Func(_SC("mulNum"), &Sample::mulNum) .Prop(_SC("Num"), &Sample::getNum, &Sample::setNum) .Var(_SC("Text"), &Sample::_text) );
}
|
上記の bindSampleClass
関数を通したVMでは、次のようなSquirrelスクリプトを実行できます。
1
2
3
4
5
6
7
8
|
| local sample = Sample();
sample.Num = 3;
local answer = sample.mulNum(5);
sample.Text = "ABC";
::print(answer + "\n"); ::print(sample.Num + "\n"); ::print(sample.Text + "\n");
|
また、定義済みのクラスのインスタンスであれば、Squirrelの変数に設定したり、関数の引数に渡すこともできます。
テンプレート引数 †
| template<
class C,
class A = DefaultAllocator<C>
> class Class;
|
class C
- このクラスの定義対象となるC++クラス型を指定します。
class A
- C++クラスに対するアロケータを指定します。
アロケータによって次のことが行われます。
- インスタンス生成(コンストラクタ呼び出し)
- インスタンスコピー
- インスタンス解放(デストラクタ呼び出し)
- Sqratで定義済みのアロケータは次の通りです(これ以外のアロケータを自前で定義することもできます)。
DefaultAllocator<C>
- インスタンスの生成、コピー、解放をすべてサポートするアロケータです。
Class<T,A>
クラスにおいてアロケータを省略した場合の既定のアロケータとなります。
NoConstructor
- インスタンスの生成、コピー、解放のいずれもサポートしない(即ち何もしない)アロケータです。
Squirrelスクリプト内で勝手に生成やコピーを行われたくない場合等に用います。
CopyOnly<C>
- インスタンスのコピーと解放をサポートし、生成はサポートしないアロケータです。
NoCopy<C>
- インスタンスの生成と解放をサポートし、コピーはサポートしないアロケータです。
公開メンバ関数一覧 †
- 継承元
- コンストラクタ
| Class(HSQUIRRELVM v = DefaultVM::Get(), bool createClass = true);
|
引数 createClass
は、このクラスを継承したクラスで独自の初期化処理を行う場合のみ false
にします。
直接このクラスを用いる場合には false
にしてはいけません。
Func
| template<class F> Class& Func(const SQChar* name, F method);
|
対象C++クラスのメンバ関数 method
をこのクラスに name
という名前でバインドします。
GetFunction
| Function GetFunction(const SQChar* name);
|
このクラスにバインドされている name
という名前の静的メンバ関数を取得します。
GetObject
| virtual HSQOBJECT GetObject() const;
virtual HSQOBJECT& GetObject();
|
Object
クラスからオーバーライド。
自身のラップ対象となるクラス型のオブジェクトを取得します。
GlobalFunc
| template<class F> Class& GlobalFunc(const SQChar* name, F method);
|
対象C++クラスのメンバ関数ではない関数 method
を、このクラスに name
という名前のメンバ関数としてバインドします。
関数 method
の第一引数は対象クラスのポインタ型にする必要があります。
呼び出される際には、第一引数に呼び出し元のクラスインスタンスが渡されます。
Overload
| template<class F> Class& Overload(const SQChar* name, F method);
|
対象C++クラスのオーバーロードメンバ関数 method
をこのクラスに name
という名前でバインドします。
基本的な使い方は Func
メンバ関数と同じですが、オーバーロード関数を定義したい場合はこちらを用います。
なお、登録できるオーバーロード関数は引数の数が異なるもののみです(引数の型が異なるだけだと上書きされます)。
Func
メンバ関数を用いる場合と比べ、呼び出し時にラッパー関数を通す分だけ若干のオーバーヘッドがあります。
Prop
| template<class V> Class& Prop(
const SQChar* name, V (C::*getMethod)() const, void (C::*setMethod)(const V&));
template<class V> Class& Prop(
const SQChar* name, V (C::*getMethod)(), void (C::*setMethod)(V));
template<class V> Class& Prop(const SQChar* name, V (C::*getMethod)() const);
template<class V> Class& Prop(const SQChar* name, V (C::*getMethod)());
|
対象C++クラスの2つのメンバ関数 getMethod
および setMethod
を、このクラスに name
という名前のプロパティとしてバインドします。
あるいは、取得専用プロパティ用に、メンバ関数 getMethod
のみをバインドすることもできます。
設定できるメンバ関数プロトタイプの組み合わせは次の2通りです。
| Type get() const;
void set(const Type& value);
|
| Type get();
void set(Type value);
|
前者は値型に、後者は参照型もしくはポインタ型に用いることになるでしょう。
SetStaticValue
| template<class V> Class& SetStaticValue(const SQChar* name, const V& val);
|
このクラスに name
という名前の静的メンバ変数を作成し、値 val
をバインドします。
既に変数が存在する場合は上書きされます。
値には基本型の他、あらかじめバインドしたクラス型も用いることができます(ただしコピー可能である必要があります)。
Squirrelでは、クラスの静的メンバ変数は定数値として扱われます。
SetValue
| template<class V> Class& SetValue(const SQChar* name, const V& val);
|
このクラスに name
という名前のメンバ変数を作成し、値 val
をバインドします。
既に変数が存在する場合は上書きされます。
値には基本型の他、あらかじめバインドしたクラス型も用いることができます(ただしコピー可能である必要があります)。
ここで渡した値はコピーされるため、Squirrel側で操作してもC++側には影響を及ぼしません。
SquirrelFunc
| template<class F> Class& SquirrelFunc(const SQChar* name, SQFUNCTION func);
|
Squirrel用関数 func
をこのクラスに name
という名前のメンバ関数としてバインドします。
StaticFunc
| template<class F> Class& StaticFunc(const SQChar* name, F method);
|
関数 method
をこのクラスに name
という名前の静的メンバ関数としてバインドします。
関数 method
は、対象C++クラスの静的メンバ関数でなくても構いません。
Var
| template<class V> Class& Var(const SQChar* name, V C::* var);
|
対象C++クラスのメンバ変数 var
をこのクラスに name
という名前でバインドします。
DerivedClass<C,B,A>
クラス … 継承クラスの定義 †
解説 †
あるC++クラスを継承しているC++クラスをSquirrelにバインドするためのクラスです。
継承元のC++クラスはあらかじめ Class<C,A>
クラスもしくはこのクラスを用いてバインド済みである必要があります。
コーディング例を次に示します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
| -
!
-
|
-
!
|
|
-
!
-
|
!
!
-
!
-
|
|
|
-
!
|
|
|
|
!
-
!
-
|
|
-
!
|
|
|
|
|
|
-
!
|
!
| class Base
{
public:
virtual double getNum() const = 0;
virtual void setNum(const double& num) = 0;
void printNum()
{
::printf("%lf\n", getNum());
}
};
class Derived : public Base
{
public:
Derived() : _num(0.0) {}
virtual double getNum() const { return _num; }
virtual void setNum(const double& num) { _num = num; }
private:
double _num;
};
void bindBaseAndDerived(HSQUIRRELVM vm)
{
using namespace Sqrat;
RootTable(vm).Bind(
_SC("Base"),
Class<Base, NoConstructor>(vm)
.Prop(_SC("Num"), &Base::getNum, &Base::setNum)
.Func(_SC("printNum"), &Base::printNum)
);
RootTable(vm).Bind(
_SC("Derived"), DerivedClass<Derived, Base>(vm));
}
|
上記の bindBaseAndDerived
関数を通したVMでは、次のようなSquirrelスクリプトを実行できます。
1
2
3
|
| local derived = Derived();
derived.Num = 3.14;
derived.printNum();
|
また、 DerivedClass<C,B,A>
クラスは Class<C,A>
クラスを継承しており、 Class<C,A>
クラスと同様にメンバ関数の追加等をすることができます。
テンプレート引数 †
| template<
class C,
class B,
class A = DefaultAllocator<C>
> class DerivedClass;
|
class C
- このクラスの定義対象となるC++クラス型を指定します。
class B
C
の継承元となるC++クラス型を指定します。
あらかじめバインド済みである必要があります。
class A
- C++クラスに対するアロケータを指定します。
詳しくは Class<C,A>
クラスのテンプレート引数の項を参照してください。
公開メンバ関数一覧 †
- 継承元
- コンストラクタ
| DerivedClass(HSQUIRRELVM v = DefaultVM::Get());
|
Enumeration
クラス … 列挙定数値の定義 †
解説 †
Enumeration
クラスは列挙定数値を定義するためのクラスです。
C/C++でいう enum
値のようなものですが、C/C++とは違い次の型の値を設定可能です。
このクラスのインスタンスは、後述する ConstTable
クラスのインスタンスにバインドして用います。
コーディング例は ConstTable
クラスの解説の項を参照してください。
公開メンバ関数一覧 †
- 継承元
- コンストラクタ
| Enumeration(HSQUIRRELVM v = DefaultVM::Get(), bool createTable = true);
|
引数 createTable
は、このクラスを継承したクラスで独自の初期化処理を行う場合のみ false
にします。
直接このクラスを用いる場合には false
にしてはいけません。
Const
| virtual Enumeration& Const(const SQChar* name, const int val);
virtual Enumeration& Const(const SQChar* name, const float val);
virtual Enumeration& Const(const SQChar* name, const SQChar* val);
|
name
という名前の列挙定数値 val
を設定します。
ConstTable
クラス … 定数テーブルの定義 †
解説 †
ConstTable
クラスは定数値を定義するためのクラスです。
また、前述の Enumeration
クラスで定義した列挙をバインドすることもできます。
定数値はSquirrelスクリプトのコンパイル時点で評価されるため、通常の変数を定数代わりに用いる場合と比べ、テーブルの走査が不要な分だけ処理速度が向上します。
コーディング例を次に示します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| -
!
-
!
-
!
| ConstTable(vm)
.Const(_SC("ConstInt"), 1) .Const(_SC("ConstFloat"), 3.5F) .Const(_SC("ConstStr"), _SC("string sample")) ;
Enumeration pos(vm);
pos.Const(_SC("Left"), 0);
pos.Const(_SC("Center"), 1);
pos.Const(_SC("Right"), 2);
ConstTable(vm).Enum(_SC("Pos"), pos);
ConstTable(vm).Enum(
_SC("Color"),
Enumeration(vm)
.Const(_SC("Red"), 0)
.Const(_SC("Green"), 1)
.Const(_SC("Blue"), 2)
);
|
上記の処理を通したVMでは、次のようなSquirrelスクリプトを実行できます。
1
2
3
4
|
| ::print(ConstInt + 3 + "\n"); ::print(ConstStr + "\n"); ::print(Pos.Center + "\n"); ::print(Color.Blue + "\n");
|
なお、 ConstTable
クラスは Enumeration
クラスを継承しています。
公開メンバ関数一覧 †
- 継承元
- コンストラクタ
| ConstTable(HSQUIRRELVM v = DefaultVM::Get());
|
Const
| virtual ConstTable& Const(const SQChar* name, const int val);
virtual ConstTable& Const(const SQChar* name, const float val);
virtual ConstTable& Const(const SQChar* name, const SQChar* val);
|
name
という名前の定数値 val
を設定します。
Enum
| ConstTable& Enum(const SQChar* name, Enumeration& en);
|
name
という名前の列挙 en
をバインドします。
Function
クラス … Squirrel関数のラッパー †
解説 †
Function
クラスは、Squirrelの関数をC++の関数的に扱う仕組みを提供します。
インスタンスの取得には Table
クラスまたは Class<C,A>
クラスの GetFunction
メンバ関数を用います。
また、 Function
クラスのコンストラクタでも同等の処理が行えます。
コーディング例は概要と導入の『関数の取得と実行』の項を参照してください。
公開メンバ関数一覧 †
- コンストラクタ
| Function();
Function(const Function& sf);
Function(const Object& e, const SQChar* slot);
|
3つ目の形式は、テーブルまたはクラスである e
から slot
という名前の関数を取得してラップ対象とします。
即ち、 e.GetFunction(slot)
と意味的には同じです。
Evaluate
| template<class R> R Evaluate();
template<class R, class A1> R Evaluate(A1 a1);
template<class R, class A1, class A2> R Evaluate(A1 a1, A2 a2);
|
返り値を取得するタイプの関数呼び出しです。
詳しくは概要と導入の『関数の取得と実行』の項を参照してください。
Execute
| void Execute();
template<class A1> void Execute(A1 a1);
template<class A1, class A2> void Execute(A1 a1, A2 a2);
|
返り値を取得しないタイプの関数呼び出しです。
詳しくは概要と導入の『関数の取得と実行』の項を参照してください。
GetEnv
-
このクラスのラップ対象である関数が属するテーブルまたはクラスのオブジェクトを取得します。
GetFunc
-
このクラスのラップ対象である関数のオブジェクトを取得します。
GetVM
-
自身を保持しているVMを取得します。
IsNull
-
自身が
null
値であるならば true
、そうでなければ false
を返します。
関数が取得できなかった場合等に null
値となります。
Release
-
自身および自身が属するテーブルまたはクラスの参照カウントをデクリメントし、自身を
null
値とします。
デストラクタでも呼び出されるため、通常このメンバ関数を直接呼び出す必要はありません。
operator()
| void operator()();
template<class A1> void operator()(A1 a1);
template<class A1, class A2> void operator()(A1 a1, A2 a2);
|
Execute
メンバ関数と同じです。
詳しくは概要と導入の『関数の取得と実行』の項を参照してください。
DefaultVM
クラス … 既定のVMの設定 †
解説 †
Sqratの各オブジェクトクラスは、コンストラクタの引数にVMをとります。
1
2
3
4
|
-
| Table myTable(vm);
Class<Foo> myClass(vm);
Script myScript(vm);
|
この仕様によって複数のVMを使い分けることができるのですが、VMを1つしか使わない場合は逆に冗長なものとなります。
そこで、 DefaultVM
クラスを使うことにより、既定のVMを設定することができます。
1
2
3
4
5
6
7
8
| -
!
-
!
-
| DefaultVM::Set(vm);
Table myTable();
Class<Foo> myClass();
Script myScript();
|
複数のVMを使う場合でも、どちらか片方を既定のVMとし、もう片方を使う場合は引数を省略しないようにすることで使い分けは可能です。
公開メンバ関数一覧 †
Get
| static HSQUIRRELVM Get();
|
既定のVMを取得します。
各オブジェクトクラスのコンストラクタ引数の既定値として用いられます。
なお、一度も Set
メンバ関数を呼びだしていない場合、この関数は不定値を返します。
Set
| static void Set(HSQUIRRELVM vm);
|
既定のVMを設定します。
Exception
クラス … Sqrat例外クラス †
解説 †
Sqratがスローする例外クラスです。
例外発生時のエラーメッセージをメンバとして持ちます。
現時点では Script
クラスの各メンバ関数でのみ用いられています。
公開メンバ関数一覧 †
- コンストラクタ
| Exception(const Sqrat::string& msg);
Exception(const Exception& ex);
|
Message
| const Sqrat::string Message() const;
|
例外メッセージを取得します。