/// <summary>キーと値のペアを用いてマップ型変数を生成します。</summary> /// <param name="values">キーと値のペア</param> /// <returns>入力データに対応するマップ型変数</returns> public static QiMap <K, V> Create(IEnumerable <KeyValuePair <K, V> > values) { if (!values.Any()) { throw new InvalidOperationException("values length must be greater than 0"); } //中身のシグネチャ揃ってるかどうか検証 var pf = values.First(); var ksig = pf.Key.Signature; var vsig = pf.Value.Signature; if (values.Any(pair => (pair.Key.Signature != ksig || pair.Value.Signature != vsig))) { throw new InvalidOperationException("key or values type is inconsistent"); } string sig = QiSignatures.TypeMapBegin + ksig + vsig + QiSignatures.TypeMapEnd; var map = QiValue.Create(sig); foreach (var pair in values) { map[pair.Key.QiValue] = pair.Value.QiValue; } return(new QiMap <K, V>(map, sig)); }
/// <summary> /// 列挙された<see cref="QiAnyValue"/>派生型から、それに対応したリストを生成します。 /// </summary> /// <param name="values">何かしらの値の列挙</param> /// <returns></returns> public static QiList <T> Create(IEnumerable <T> values) { if (!values.Any()) { throw new InvalidOperationException("values length must be greater than 0"); } //リストは中身のシグネチャ揃ってないとアウト(ダイナミックリストの場合は例外) string elemSig = values.First().Signature; if (values.Any(v => v.Signature != elemSig)) { throw new InvalidOperationException("values kind is not same"); } string sig = QiSignatures.TypeListBegin + elemSig + QiSignatures.TypeListEnd; var list = QiValue.Create(sig); foreach (var v in values) { list.AddElement(v.QiValue); } return(new QiList <T>(list, sig)); }
/// <summary> /// 全ての要素が<see cref="QiDynamic"/>であるようなタプルを生成します。 /// このようなタプルは<see cref="QiMethod.Call"/>の引数として渡す処理に適しています。 /// </summary> /// <param name="values">タプルの要素</param> /// <returns>生成されたタプル</returns> public static QiTuple CreateDynamic(params QiAnyValue[] values) { string sig = QiSignatures.TypeTupleBegin + new string(QiSignatures.TypeDynamic[0], values.Length) + QiSignatures.TypeTupleEnd; var tuple = QiValue.Create(sig); for (int i = 0; i < values.Length; i++) { tuple[i] = values[i].QiValue; } return(new QiTuple(tuple, sig)); }
/// <summary> /// 列挙された<see cref="QiAnyValue"/>派生型を要素として含む、動的型の内容からなるリストを生成します。 /// </summary> /// <param name="values">何かしらの値の列挙</param> /// <returns>指定した値を保持する動的型のリスト</returns> public static QiList <QiDynamic> CreateDynamic(IEnumerable <QiAnyValue> values) { if (!values.Any()) { throw new InvalidOperationException("values length must be greater than 0"); } string sig = QiSignatures.TypeListBegin + QiSignatures.TypeDynamic + QiSignatures.TypeListEnd; var list = QiValue.Create(sig); foreach (var v in values) { list.AddElement(v.QiValue); } return(new QiList <QiDynamic>(list, sig)); }
/// <summary>内容として用いる値を指定してタプルを生成します。</summary> /// <param name="values">タプルに含む値</param> /// <returns>指定した値を順に格納したタプル</returns> public static QiTuple Create(params QiAnyValue[] values) { string sig = QiSignatures.TypeTupleBegin + string.Join("", values.Select(v => v.Signature).ToArray()) + QiSignatures.TypeTupleEnd; var tuple = QiValue.Create(sig); for (int i = 0; i < values.Length; i++) { //Dynamicはそのまま渡すと想定外の入れ子構造を取るので中身を渡す if (values[i].Signature == QiSignatures.TypeDynamic) { tuple[i] = (values[i] as QiDynamic).Value; } else { tuple[i] = values[i].QiValue; } } return(new QiTuple(tuple, sig)); }
/// <summary> /// 格納する値を指定してインスタンスを初期化します。 /// </summary> /// <param name="value">格納する値</param> public QiInt16(short value) { QiValue = QiValue.Create(QiSignatures.TypeInt16); QiValue.SetValue(value); }
/// <summary> /// 格納する値を指定してインスタンスを初期化します。 /// </summary> /// <param name="value">格納する値</param> public QiInt8(sbyte value) { QiValue = QiValue.Create(QiSignatures.TypeInt8); QiValue.SetValue(value); }
/// <summary> /// 格納する値を指定してインスタンスを初期化します。 /// </summary> /// <param name="value">格納する値</param> public QiUInt64(ulong value) { QiValue = QiValue.Create(QiSignatures.TypeUInt64); QiValue.SetValue(value); }
/// <summary> /// 格納する値を指定してインスタンスを初期化します。 /// </summary> /// <param name="value">格納する値</param> public QiUInt32(uint value) { QiValue = QiValue.Create(QiSignatures.TypeUInt32); QiValue.SetValue(value); }
/// <summary> /// 格納する値を指定してインスタンスを初期化します。 /// </summary> /// <param name="value">格納する値</param> public QiBool(bool value) { QiValue = QiValue.Create(QiSignatures.TypeBool); QiValue.SetValue(Convert.ToInt64(value)); }