/* * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ using System; /// <summary> /// This interface should be implemented by any class whose instances are intended /// to be executed by a thread. /// </summary> public interface IThreadRunnable { /// <summary> /// This method has to be implemented in order that starting of the thread causes the object's /// run method to be called in that separately executing thread. /// </summary> void Run(); } /// <summary> /// Contains conversion support elements such as classes, interfaces and static methods. /// </summary> public class SupportClass { /// <summary> /// Performs an unsigned bitwise right shift with the specified number /// </summary> /// <param name="number">Number to operate on</param> /// <param name="bits">Ammount of bits to shift</param> /// <returns>The resulting number from the shift operation</returns> public static int URShift(int number, int bits) { if ( number >= 0) return number >> bits; else return (number >> bits) + (2 << ~bits); } /// <summary> /// Performs an unsigned bitwise right shift with the specified number /// </summary> /// <param name="number">Number to operate on</param> /// <param name="bits">Ammount of bits to shift</param> /// <returns>The resulting number from the shift operation</returns> public static int URShift(int number, long bits) { return URShift(number, (int)bits); } /// <summary> /// Performs an unsigned bitwise right shift with the specified number /// </summary> /// <param name="number">Number to operate on</param> /// <param name="bits">Ammount of bits to shift</param> /// <returns>The resulting number from the shift operation</returns> public static long URShift(long number, int bits) { if ( number >= 0) return number >> bits; else return (number >> bits) + (2L << ~bits); } /// <summary> /// Performs an unsigned bitwise right shift with the specified number /// </summary> /// <param name="number">Number to operate on</param> /// <param name="bits">Ammount of bits to shift</param> /// <returns>The resulting number from the shift operation</returns> public static long URShift(long number, long bits) { return URShift(number, (int)bits); } /*******************************/ /// <summary> /// Copies an array of chars obtained from a String into a specified array of chars /// </summary> /// <param name="sourceString">The String to get the chars from</param> /// <param name="sourceStart">Position of the String to start getting the chars</param> /// <param name="sourceEnd">Position of the String to end getting the chars</param> /// <param name="destinationArray">Array to return the chars</param> /// <param name="destinationStart">Position of the destination array of chars to start storing the chars</param> /// <returns>An array of chars</returns> public static void GetCharsFromString(System.String sourceString, int sourceStart, int sourceEnd, char[] destinationArray, int destinationStart) { int sourceCounter; int destinationCounter; sourceCounter = sourceStart; destinationCounter = destinationStart; while (sourceCounter < sourceEnd) { destinationArray[destinationCounter] = (char) sourceString[sourceCounter]; sourceCounter++; destinationCounter++; } } /*******************************/ /// <summary> /// Converts an array of sbytes to an array of bytes /// </summary> /// <param name="sbyteArray">The array of sbytes to be converted</param> /// <returns>The new array of bytes</returns> public static byte[] ToByteArray(sbyte[] sbyteArray) { byte[] byteArray = null; if (sbyteArray != null) { byteArray = new byte[sbyteArray.Length]; for(int index=0; index < sbyteArray.Length; index++) byteArray[index] = (byte) sbyteArray[index]; } return byteArray; } /// <summary> /// Converts a string to an array of bytes /// </summary> /// <param name="sourceString">The string to be converted</param> /// <returns>The new array of bytes</returns> public static byte[] ToByteArray(System.String sourceString) { return System.Text.UTF8Encoding.UTF8.GetBytes(sourceString); } /// <summary> /// Converts a array of object-type instances to a byte-type array. /// </summary> /// <param name="tempObjectArray">Array to convert.</param> /// <returns>An array of byte type elements.</returns> public static byte[] ToByteArray(System.Object[] tempObjectArray) { byte[] byteArray = null; if (tempObjectArray != null) { byteArray = new byte[tempObjectArray.Length]; for (int index = 0; index < tempObjectArray.Length; index++) byteArray[index] = (byte)tempObjectArray[index]; } return byteArray; } /*******************************/ /// <summary> /// Sets the capacity for the specified ArrayList /// </summary> /// <param name="vector">The ArrayList which capacity will be set</param> /// <param name="newCapacity">The new capacity value</param> public static void SetCapacity(System.Collections.ArrayList vector, int newCapacity) { if (newCapacity > vector.Count) vector.AddRange(new Array[newCapacity-vector.Count]); else if (newCapacity < vector.Count) vector.RemoveRange(newCapacity, vector.Count - newCapacity); vector.Capacity = newCapacity; } /*******************************/ /// <summary> /// This method returns the literal value received /// </summary> /// <param name="literal">The literal to return</param> /// <returns>The received value</returns> public static long Identity(long literal) { return literal; } /// <summary> /// This method returns the literal value received /// </summary> /// <param name="literal">The literal to return</param> /// <returns>The received value</returns> public static ulong Identity(ulong literal) { return literal; } /// <summary> /// This method returns the literal value received /// </summary> /// <param name="literal">The literal to return</param> /// <returns>The received value</returns> public static float Identity(float literal) { return literal; } /// <summary> /// This method returns the literal value received /// </summary> /// <param name="literal">The literal to return</param> /// <returns>The received value</returns> public static double Identity(double literal) { return literal; } /*******************************/ /// <summary> /// Support class used to handle threads /// </summary> public class ThreadClass : IThreadRunnable { /// <summary> /// The instance of System.Threading.Thread /// </summary> private System.Threading.Thread threadField; /// <summary> /// Initializes a new instance of the ThreadClass class /// </summary> public ThreadClass() { threadField = new System.Threading.Thread(new System.Threading.ThreadStart(Run)); } /// <summary> /// Initializes a new instance of the Thread class. /// </summary> /// <param name="Name">The name of the thread</param> public ThreadClass(System.String Name) { threadField = new System.Threading.Thread(new System.Threading.ThreadStart(Run)); this.Name = Name; } /// <summary> /// Initializes a new instance of the Thread class. /// </summary> /// <param name="Start">A ThreadStart delegate that references the methods to be invoked when this thread begins executing</param> public ThreadClass(System.Threading.ThreadStart Start) { threadField = new System.Threading.Thread(Start); } /// <summary> /// Initializes a new instance of the Thread class. /// </summary> /// <param name="Start">A ThreadStart delegate that references the methods to be invoked when this thread begins executing</param> /// <param name="Name">The name of the thread</param> public ThreadClass(System.Threading.ThreadStart Start, System.String Name) { threadField = new System.Threading.Thread(Start); this.Name = Name; } /// <summary> /// This method has no functionality unless the method is overridden /// </summary> public virtual void Run() { } /// <summary> /// Causes the operating system to change the state of the current thread instance to ThreadState.Running /// </summary> public virtual void Start() { threadField.Start(); } ///// <summary> ///// Interrupts a thread that is in the WaitSleepJoin thread state ///// </summary> //public virtual void Interrupt() //{ // threadField.Interrupt(); //} /// <summary> /// Gets the current thread instance /// </summary> public System.Threading.Thread Instance { get { return threadField; } set { threadField = value; } } /// <summary> /// Gets or sets the name of the thread /// </summary> public System.String Name { get { return threadField.Name; } set { if (threadField.Name == null) threadField.Name = value; } } /// <summary> /// Gets or sets a value indicating the scheduling priority of a thread /// </summary> public System.Threading.ThreadPriority Priority { get { return threadField.Priority; } set { threadField.Priority = value; } } ///// <summary> ///// Gets a value indicating the execution status of the current thread ///// </summary> //public bool IsAlive //{ // get // { // return threadField.IsAlive; // } //} /// <summary> /// Gets or sets a value indicating whether or not a thread is a background thread. /// </summary> public bool IsBackground { get { return threadField.IsBackground; } set { threadField.IsBackground = value; } } /// <summary> /// Blocks the calling thread until a thread terminates /// </summary> public void Join() { threadField.Join(); } /// <summary> /// Blocks the calling thread until a thread terminates or the specified time elapses /// </summary> /// <param name="MiliSeconds">Time of wait in milliseconds</param> public void Join(int MiliSeconds) { lock(this) { threadField.Join(MiliSeconds); } } ///// <summary> ///// Blocks the calling thread until a thread terminates or the specified time elapses ///// </summary> ///// <param name="MiliSeconds">Time of wait in milliseconds</param> ///// <param name="NanoSeconds">Time of wait in nanoseconds</param> //public void Join(long MiliSeconds, int NanoSeconds) //{ // lock(this) // { // threadField.Join(new System.TimeSpan(MiliSeconds * 10000 + NanoSeconds * 100)); // } //} ///// <summary> ///// Resumes a thread that has been suspended ///// </summary> //public void Resume() //{ // threadField.Resume(); //} /// <summary> /// Raises a ThreadAbortException in the thread on which it is invoked, /// to begin the process of terminating the thread. Calling this method /// usually terminates the thread /// </summary> public void Abort() { threadField.Abort(); } /// <summary> /// Raises a ThreadAbortException in the thread on which it is invoked, /// to begin the process of terminating the thread while also providing /// exception information about the thread termination. /// Calling this method usually terminates the thread. /// </summary> /// <param name="stateInfo">An object that contains application-specific information, such as state, which can be used by the thread being aborted</param> public void Abort(System.Object stateInfo) { lock(this) { threadField.Abort(stateInfo); } } ///// <summary> ///// Suspends the thread, if the thread is already suspended it has no effect ///// </summary> //public void Suspend() //{ // threadField.Suspend(); //} /// <summary> /// Obtain a String that represents the current Object /// </summary> /// <returns>A String that represents the current Object</returns> public override System.String ToString() { return "Thread[" + Name + "," + Priority.ToString() + "," + "" + "]"; } /// <summary> /// Gets the currently running thread /// </summary> /// <returns>The currently running thread</returns> public static ThreadClass Current() { ThreadClass CurrentThread = new ThreadClass(); CurrentThread.Instance = System.Threading.Thread.CurrentThread; return CurrentThread; } } }