Create() public static method

シグネチャを指定して値を初期化します。
public static Create ( string sig ) : QiValue
sig string 値のシグネチャを表す文字列
return QiValue
Esempio n. 1
0
        /// <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));
        }
Esempio n. 2
0
        /// <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));
        }
Esempio n. 3
0
        /// <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));
        }
Esempio n. 4
0
        /// <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));
        }
Esempio n. 5
0
        /// <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));
        }
Esempio n. 6
0
 /// <summary>
 /// 格納する値を指定してインスタンスを初期化します。
 /// </summary>
 /// <param name="value">格納する値</param>
 public QiInt16(short value)
 {
     QiValue = QiValue.Create(QiSignatures.TypeInt16);
     QiValue.SetValue(value);
 }
Esempio n. 7
0
 /// <summary>
 /// 格納する値を指定してインスタンスを初期化します。
 /// </summary>
 /// <param name="value">格納する値</param>
 public QiInt8(sbyte value)
 {
     QiValue = QiValue.Create(QiSignatures.TypeInt8);
     QiValue.SetValue(value);
 }
Esempio n. 8
0
 /// <summary>
 /// 格納する値を指定してインスタンスを初期化します。
 /// </summary>
 /// <param name="value">格納する値</param>
 public QiUInt64(ulong value)
 {
     QiValue = QiValue.Create(QiSignatures.TypeUInt64);
     QiValue.SetValue(value);
 }
Esempio n. 9
0
 /// <summary>
 /// 格納する値を指定してインスタンスを初期化します。
 /// </summary>
 /// <param name="value">格納する値</param>
 public QiUInt32(uint value)
 {
     QiValue = QiValue.Create(QiSignatures.TypeUInt32);
     QiValue.SetValue(value);
 }
Esempio n. 10
0
 /// <summary>
 /// 格納する値を指定してインスタンスを初期化します。
 /// </summary>
 /// <param name="value">格納する値</param>
 public QiBool(bool value)
 {
     QiValue = QiValue.Create(QiSignatures.TypeBool);
     QiValue.SetValue(Convert.ToInt64(value));
 }