610b34412c4444e88e006b8dbcf9e871dc572ad2
[IRC.git] /
1 /*
2  * To change this template, choose Tools | Templates
3  * and open the template in the editor.
4  */
5
6 package com.enea.jcarder.transactionalinterfaces;
7
8 import com.enea.jcarder.transactionalinterfaces.bytebuffer.byteholder;
9 import dstm2.AtomicArray;
10 import dstm2.atomic;
11 import dstm2.Thread;
12 import dstm2.factory.Factory;
13 import java.nio.BufferOverflowException;
14 import java.nio.ByteBuffer;
15
16 /**
17  *
18  * @author navid
19  */
20 public class bytebuffer {
21     
22    
23     static Factory<bytebufferif> factory = Thread.makeFactory(bytebufferif.class);
24     public static Factory<byteholder> factory2 = Thread.makeFactory(byteholder.class);
25    
26     
27     public bytebufferif mbuffer;
28     
29     public int capacity(){
30         return mbuffer.getCapacity();
31     }
32     
33     public int position(){
34         return mbuffer.getPosition();
35     }
36     
37     public bytebufferif flip(){
38         mbuffer.setLimit(mbuffer.getPosition());
39         mbuffer.setPosition(0);
40         return mbuffer;
41     }
42     
43     public final bytebufferif clear(){
44         mbuffer.setPosition(0);
45         mbuffer.setLimit(mbuffer.getCapacity());
46         return mbuffer;
47     }
48     
49     public final boolean hasRemaining(){
50         return mbuffer.getPosition() < mbuffer.getLimit();
51     }
52     
53     public final int remaining(){
54         return mbuffer.getLimit() - mbuffer.getPosition();
55     }
56     
57     public void put(byte value){
58         if (mbuffer.getByteHolder().get(mbuffer.getPosition()) ==  null)
59             mbuffer.getByteHolder().set(mbuffer.getPosition(), factory2.create());
60         mbuffer.getByteHolder().get(mbuffer.getPosition()).setByte(value);
61         mbuffer.setPosition(mbuffer.getPosition()+1);
62     }
63     
64     public void put(ByteBuffer value){
65         
66         if (remaining() < value.remaining())
67             throw new BufferOverflowException();
68         
69         for (int i=0; i<value.remaining(); i++){
70             if (mbuffer.getByteHolder().get(mbuffer.getPosition()) ==  null)
71                 mbuffer.getByteHolder().set(mbuffer.getPosition(), factory2.create());
72             mbuffer.getByteHolder().get(mbuffer.getPosition()).setByte(value.get());
73             mbuffer.setPosition(mbuffer.getPosition()+1);
74             //System.out.println("sss");
75         }
76     }
77     
78
79     
80     public bytebuffer allocateDirect(int capacity){
81         mbuffer = factory.create();
82         mbuffer.setByteHolder(new AtomicArray<byteholder>(byteholder.class,capacity));
83         mbuffer.setPosition(0);
84         mbuffer.setLimit(capacity);
85         mbuffer.setCapacity(capacity);
86         AtomicArray<byteholder> ar = mbuffer.getByteHolder();
87         //for (int i=0; i<capacity; i++){
88           //  ar.set(i, factory2.create());
89         //}
90       //  for (int i=0; i<capacity; i++)
91       //      mbuffer.getByteHolder().set(i, factory2.create());
92        // mbuffer.getByteHolder().set(0, factory2.create());
93        // mbuffer.getByteHolder().get(0).setByte((byte)2);
94         return this;
95     }
96     
97     public byte[] getBytes(){
98         int length = remaining();
99         byte[] result = new byte[length];
100         int i = 0;
101         while (hasRemaining()) {
102             result[i] = mbuffer.getByteHolder().get(mbuffer.getPosition()).getByte();
103             mbuffer.setPosition(mbuffer.getPosition()+1);
104             i++;
105         }
106         return result;
107     }
108      
109      @atomic public interface bytebufferif{
110         int getLimit();
111         void setLimit(int value);
112         int getPosition();
113         void setPosition(int value);
114         int getCapacity();
115         void setCapacity(int value);
116         AtomicArray<byteholder> getByteHolder();
117         void setByteHolder(AtomicArray<byteholder> bytes);
118      }
119      
120      @atomic public interface byteholder{
121          byte getByte();
122          void setByte(byte value);
123      }
124      
125     
126
127 }