/// <summary> /// シーケンスの要素を一つ読みだして、読み出しポインタを次へ1つ移動させる /// </summary> /// <param name="elem"></param> /// <param name="reader"></param> #else /// <summary> /// /// </summary> /// <typeparam name="T"></typeparam> /// <param name="elem"></param> /// <param name="reader"></param> #endif public static void REV_READ_SEQ_ELEM <T>(out T elem, CvSeqReader reader) where T : struct { if (reader == null) { throw new ArgumentNullException("reader"); } //Type t = typeof(t); //if (t.IsValueType) { using (StructurePointer <T> elemPtr = new StructurePointer <T>()) { if (reader.Seq.ElemSize != elemPtr.Size) { throw new OpenCvSharpException(); } Util.CopyMemory(elemPtr.Ptr, reader.Ptr, elemPtr.Size); PREV_SEQ_ELEM(elemPtr.Size, reader); elem = elemPtr.ToStructure(); } } /* * else * { * IntPtr elemPtr; * REV_READ_SEQ_ELEM<IntPtr>(out elemPtr, reader); * elem = Util.ToObject<t>(elemPtr); * } * //*/ }
/// <summary> /// /// </summary> /// <typeparam name="T"></typeparam> /// <param name="elem"></param> /// <param name="writer"></param> #else /// <summary> /// /// </summary> /// <typeparam name="T"></typeparam> /// <param name="elem"></param> /// <param name="writer"></param> #endif public static void WRITE_SEQ_ELEM <T>(T elem, CvSeqWriter writer) where T : struct { int size = Marshal.SizeOf(typeof(T)); if (writer.Seq.ElemSize != size) { throw new OpenCvSharpException(); } if (writer.Ptr.ToInt64() >= writer.BlockMax.ToInt64()) { NativeMethods.cvCreateSeqBlock(writer.CvPtr); } if (writer.Ptr.ToInt64() > writer.BlockMax.ToInt64() - size) { throw new OpenCvSharpException(); } using (var elemPtr = new StructurePointer <T>(elem)) { Util.CopyMemory(writer.Ptr, elemPtr, size); } writer.Ptr = new IntPtr(writer.Ptr.ToInt64() + size); }
/// <summary> /// 指定したインデックスの配列の要素を設定する /// </summary> /// <param name="index">配列のインデックス</param> /// <param name="value">割り当てる値</param> #else /// <summary> /// Change the particular array element /// </summary> /// <param name="index">zero-based component of the element index </param> /// <param name="value">The assigned value </param> #endif public void Set(int index, T value) { using (StructurePointer <T> src = new StructurePointer <T>(value)) { IntPtr dst = new IntPtr(_ptr.ToInt64() + (_size * index)); Util.CopyMemory(dst, src, _size); } }