找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1714|回复: 2

[分享] LispBase ResultBuffer

[复制链接]

已领礼包: 859个

财富等级: 财运亨通

发表于 2014-5-8 13:17:31 来自手机 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
本帖最后由 csharp 于 2014-5-9 07:13 编辑

http://www.theswamp.org/index.php?topic=20097.0
  1. namespace LispBase
  2. {
  3.   public static class ResultBufferExtension
  4.   {
  5.     //add
  6.     public static void Add(this ResultBuffer m_this, int typecode)
  7.     {
  8.       m_this.Add(new TypedValue(typecode));
  9.     }
  10.     public static void Add(this ResultBuffer m_this, int typecode, object value)
  11.     {
  12.       m_this.Add(new TypedValue(typecode, value));
  13.     }
  14.     public static void Add(this ResultBuffer m_this, LispDataType type)
  15.     {
  16.       m_this.Add(new TypedValue((int)type));
  17.     }
  18.     public static void Add(this ResultBuffer m_this, LispDataType type, object value)
  19.     {
  20.       m_this.Add(new TypedValue((int)type, value));
  21.     }
  22.     public static void Add(this ResultBuffer m_this, DxfCode type)
  23.     {
  24.       m_this.Add(new TypedValue((int)type));
  25.     }
  26.     public static void Add(this ResultBuffer m_this, DxfCode type, object value)
  27.     {
  28.       m_this.Add(new TypedValue((int)type, value));
  29.     }

  30.     //AddRange
  31.     public static void AddRange(this ResultBuffer m_this, ResultBuffer src)
  32.     {
  33.       if (src == null)
  34.         throw new ArgumentNullException();

  35.       foreach (TypedValue e in src)
  36.         m_this.Add(e);

  37.     }
  38.     public static void AddRange(this ResultBuffer m_this, TypedValue[] src)
  39.     {
  40.       if (src == null)
  41.         throw new ArgumentNullException();

  42.       foreach (TypedValue e in src)
  43.         m_this.Add(e);

  44.     }
  45.     public static void AddRange(this ResultBuffer m_this, IEnumerable<TypedValue> src)
  46.     {
  47.       if (src == null)
  48.         throw new ArgumentNullException();

  49.       foreach (TypedValue e in src)
  50.         m_this.Add(e);

  51.     }

  52.     //Some Lisp stuff .. add what you need
  53.     public static void AddLispT(this ResultBuffer m_this)
  54.     {
  55.       m_this.Add(new TypedValue((int)LispDataType.T_atom));
  56.     }
  57.     public static void AddLispNil(this ResultBuffer m_this)
  58.     {
  59.       m_this.Add(new TypedValue((int)LispDataType.Nil));
  60.     }
  61.     public static void AddLispString(this ResultBuffer m_this, string str)
  62.     {
  63.       m_this.Add(new TypedValue((int)LispDataType.Text, str));
  64.     }
  65.     public static void AddLispDouble(this ResultBuffer m_this, double num)
  66.     {
  67.       m_this.Add(new TypedValue((int)LispDataType.Double, num));
  68.     }
  69.     public static void AddLispInt(this ResultBuffer m_this, int num)
  70.     {
  71.       m_this.Add(new TypedValue((int)LispDataType.Int32, num));
  72.     }
  73.     public static void AddLispErr(this ResultBuffer m_this, string message)
  74.     {
  75.       m_this.Add(new TypedValue((int)LispDataType.Nil));
  76.       m_this.Add(new TypedValue((int)LispDataType.DottedPair));
  77.       m_this.Add(new TypedValue((int)LispDataType.Text, "Error: " + message));
  78.     }

  79.     //
  80.     public static void ForEach(this ResultBuffer m_this, Action<TypedValue> action)
  81.     {
  82.       if (action == null)
  83.         throw new ArgumentNullException();

  84.       foreach (TypedValue e in m_this)
  85.         action(e);
  86.     }

  87.     //
  88.     public static TypedValue GetAt(this ResultBuffer m_this, int index)
  89.     {
  90.       return m_this.AsArray()[index];
  91.     }

  92.     //
  93.     public static int GetCount(this ResultBuffer m_this)
  94.     {
  95.       int cnt = 0;

  96.       foreach (TypedValue e in m_this)
  97.         cnt += 1;

  98.       return cnt;
  99.     }

  100.     //
  101.     public static List<TypedValue> ToList(this ResultBuffer m_this)
  102.     {
  103.       return new List<TypedValue>(m_this.AsArray());
  104.     }

  105.     //add some LinQ
  106.     public static IEnumerable<TypedValue> Where
  107.       (this ResultBuffer m_this, Func<TypedValue, bool> predicate)
  108.     {
  109.       foreach (TypedValue element in m_this)
  110.       {
  111.         if (predicate(element) == true)
  112.           yield return element;
  113.       }
  114.     }

  115.     public static IEnumerable<TypedValue> Select
  116.       (this ResultBuffer m_this, Func<TypedValue, TypedValue> selector)
  117.     {
  118.       foreach (TypedValue element in m_this)
  119.       {
  120.         yield return selector(element);
  121.       }
  122.     }
  123.   }
  124. }

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 859个

财富等级: 财运亨通

 楼主| 发表于 2014-5-9 07:14:38 | 显示全部楼层
  1. public static class ObjectToTypedValue {
  2.     #region Public Converter functions
  3.     //  Blank (like returned by princ)
  4.     public static object Convert() {
  5.         return new TypedValue((int)LispDataType.None);
  6.     }
  7.    
  8.     // Integers (32 bit or other)
  9.     public static object Convert(int value) {
  10.         return new TypedValue((int)LispDataType.Text, value);
  11.     }
  12.    
  13.     // 16 bit integers
  14.     public static object Convert(Int16 value) {
  15.         return new TypedValue((int)LispDataType.Int16, value);
  16.     }
  17.    
  18.     // Doubles
  19.     public static object Convert(double value) {
  20.         return new TypedValue((int)LispDataType.Double, value);
  21.     }
  22.    
  23.     // Strings
  24.     public static object Convert(string value) {
  25.         return new TypedValue((int)LispDataType.Text, value);
  26.     }
  27.    
  28.     // Booleans
  29.     public static object Convert(bool value) {
  30.         if ((bool) value)
  31.             return new TypedValue((int)LispDataType.T_atom);
  32.         return  new TypedValue((int)LispDataType.Nil);
  33.     }
  34.    
  35.     // 2d Points
  36.     public static object Convert(Point2d value) {
  37.         return new TypedValue((int)LispDataType.Point2d, value);
  38.     }
  39.    
  40.     // 3d Points
  41.     public static object Convert(Point3d value) {
  42.         return new TypedValue((int)LispDataType.Point3d, value);
  43.     }
  44.    
  45.     // Catch all other objects including null
  46.     public static object Convert(object value) {
  47.         if (value == null)
  48.             return new TypedValue((int)LispDataType.Nil);
  49.         if (value is IEnumerable) {
  50.             ResultBuffer rb = new ResultBuffer();
  51.             AddToRB(rb, value);
  52.             return rb;
  53.         }
  54.         return Convert(value as string);
  55.     }
  56.     #endregion
  57.    
  58.     #region Private helper functions for enumerable types
  59.     // Unhandled objects in enumerables
  60.     private static void AddToRB(ResultBuffer rb, object value) {
  61.         rb.Add(Convert(value));
  62.     }
  63.    
  64.     // Tuples to dotted pairs
  65.     private static void AddToRB(ResultBuffer rb, Tuple<object, object> value) {
  66.         rb.Add(new TypedValue((int)LispDataType.DottedPair));
  67.         AddToRB(rb, value.Item1);
  68.         AddToRB(rb, value.Item2);
  69.         rb.Add(new TypedValue((int)LispDataType.ListEnd));
  70.     }
  71.    
  72.     // Dictionary entry to association pair
  73.     private static void AddToRB(ResultBuffer rb, DictionaryEntry value) {
  74.         IEnumerable en = value.Value as IEnumerable;
  75.         if (en == null) {
  76.             rb.Add(new TypedValue((int)LispDataType.DottedPair));
  77.             AddToRB(rb, value.Key);
  78.             AddToRB(rb, value.Value);
  79.         } else {
  80.             rb.Add(new TypedValue((int)LispDataType.ListBegin));
  81.             rb.Add(Convert(value.Key));
  82.             foreach (object element in en) {
  83.                 AddToRB(rb, element);
  84.             }
  85.         }
  86.         rb.Add(new TypedValue((int)LispDataType.ListEnd));
  87.     }
  88.    
  89.     // Hash tables to association lists
  90.     private static void AddToRB(ResultBuffer rb, IDictionary value) {
  91.         rb.Add(new TypedValue((int)LispDataType.ListBegin));
  92.         IDictionaryEnumerator en = value.GetEnumerator();
  93.         while (en.MoveNext()) {
  94.             AddToRB(rb, en.Current);
  95.         }
  96.         rb.Add(new TypedValue((int)LispDataType.ListEnd));
  97.     }
  98.    
  99.     // Lists, collections and arrays to Lisp Lists
  100.     private static void AddToRB(ResultBuffer rb, IEnumerable value) {
  101.         rb.Add(new TypedValue((int)LispDataType.ListBegin));
  102.         foreach (object element in value) {
  103.             AddToRB(rb, element);
  104.         }
  105.         rb.Add(new TypedValue((int)LispDataType.ListEnd));
  106.     }
  107.     #endregion
  108. }
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

 楼主| 发表于 2014-5-9 07:17:57 | 显示全部楼层
直接 Add 不是一个最佳方法,用下面方法为上
TypeValue [] result = new TypeValue [count];
.....
ResultBuffer ret = new ResultBuffer(result);
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-17 22:36 , Processed in 0.161027 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表