2 * To change this template, choose Tools | Templates
3 * and open the template in the editor.
6 package com.enea.jcarder.transactionalinterfaces;
8 import com.enea.jcarder.transactionalinterfaces.bytebuffer.byteholder;
9 import dstm2.AtomicArray;
12 import dstm2.factory.Factory;
13 import java.nio.BufferOverflowException;
14 import java.nio.ByteBuffer;
20 public class bytebuffer {
23 static Factory<bytebufferif> factory = Thread.makeFactory(bytebufferif.class);
24 public static Factory<byteholder> factory2 = Thread.makeFactory(byteholder.class);
27 public bytebufferif mbuffer;
29 public int capacity(){
30 return mbuffer.getCapacity();
33 public int position(){
34 return mbuffer.getPosition();
37 public bytebufferif flip(){
38 mbuffer.setLimit(mbuffer.getPosition());
39 mbuffer.setPosition(0);
43 public final bytebufferif clear(){
44 mbuffer.setPosition(0);
45 mbuffer.setLimit(mbuffer.getCapacity());
49 public final boolean hasRemaining(){
50 return mbuffer.getPosition() < mbuffer.getLimit();
53 public final int remaining(){
54 return mbuffer.getLimit() - mbuffer.getPosition();
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);
64 public void put(ByteBuffer value){
66 if (remaining() < value.remaining())
67 throw new BufferOverflowException();
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");
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());
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);
97 public byte[] getBytes(){
98 int length = remaining();
99 byte[] result = new byte[length];
101 while (hasRemaining()) {
102 result[i] = mbuffer.getByteHolder().get(mbuffer.getPosition()).getByte();
103 mbuffer.setPosition(mbuffer.getPosition()+1);
109 @atomic public interface bytebufferif{
111 void setLimit(int value);
113 void setPosition(int value);
115 void setCapacity(int value);
116 AtomicArray<byteholder> getByteHolder();
117 void setByteHolder(AtomicArray<byteholder> bytes);
120 @atomic public interface byteholder{
122 void setByte(byte value);