[BACK]Return to generic_vectors.adb CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / PHC / Ada / Math_Lib / Matrices

Annotation of OpenXM_contrib/PHC/Ada/Math_Lib/Matrices/generic_vectors.adb, Revision 1.1

1.1     ! maekawa     1: with unchecked_deallocation;
        !             2:
        !             3: package body Generic_Vectors is
        !             4:
        !             5: -- COMPARISON AND COPYING :
        !             6:
        !             7:   function Equal ( v1,v2 : Vector ) return boolean is
        !             8:   begin
        !             9:     if v1'first /= v2'first or else v1'last /= v2'last
        !            10:      then return false;
        !            11:      else for i in v1'range loop
        !            12:             if not equal(v1(i),v2(i))
        !            13:              then return false;
        !            14:             end if;
        !            15:           end loop;
        !            16:           return true;
        !            17:     end if;
        !            18:   end Equal;
        !            19:
        !            20:   procedure Copy ( v1: in Vector; v2 : in out Vector ) is
        !            21:   begin
        !            22:     if v1'first /= v2'first or else v1'last /= v2'last
        !            23:      then raise CONSTRAINT_ERROR;
        !            24:      else Clear(v2);
        !            25:           for i in v1'range loop
        !            26:             copy(v1(i),v2(i));
        !            27:           end loop;
        !            28:     end if;
        !            29:   end Copy;
        !            30:
        !            31: -- ARITHMETIC AS FUNCTIONS :
        !            32:
        !            33:   function "+" ( v1,v2 : Vector ) return Vector is
        !            34:   begin
        !            35:     if v1'first /= v2'first or else v1'last /= v2'last
        !            36:      then raise CONSTRAINT_ERROR;
        !            37:      else declare
        !            38:             res : Vector(v1'range);
        !            39:           begin
        !            40:             for i in v1'range loop
        !            41:               res(i) := v1(i) + v2(i);
        !            42:             end loop;
        !            43:             return res;
        !            44:           end;
        !            45:     end if;
        !            46:   end "+";
        !            47:
        !            48:   function "+" ( v : Vector ) return Vector is
        !            49:
        !            50:     res : Vector(v'range);
        !            51:
        !            52:   begin
        !            53:     for i in v'range loop
        !            54:       res(i) := +v(i);
        !            55:     end loop;
        !            56:     return res;
        !            57:   end "+";
        !            58:
        !            59:   function "-" ( v : Vector ) return Vector is
        !            60:
        !            61:     res : Vector(v'range);
        !            62:
        !            63:   begin
        !            64:     for i in v'range loop
        !            65:       res(i) := -v(i);
        !            66:     end loop;
        !            67:     return res;
        !            68:   end "-";
        !            69:
        !            70:   function "-" ( v1,v2 : Vector ) return Vector is
        !            71:   begin
        !            72:     if v1'first /= v2'first or else v1'last /= v2'last
        !            73:      then raise CONSTRAINT_ERROR;
        !            74:      else declare
        !            75:             res : Vector(v1'range);
        !            76:           begin
        !            77:             for i in v1'range loop
        !            78:               res(i) := v1(i) - v2(i);
        !            79:             end loop;
        !            80:             return res;
        !            81:           end;
        !            82:     end if;
        !            83:   end "-";
        !            84:
        !            85:   function "*" ( v : Vector; a : number ) return Vector is
        !            86:
        !            87:     res : Vector(v'range);
        !            88:
        !            89:   begin
        !            90:     for i in v'range loop
        !            91:       res(i) := v(i) * a;
        !            92:     end loop;
        !            93:     return res;
        !            94:   end "*";
        !            95:
        !            96:   function "*" ( a : number; v : Vector ) return Vector is
        !            97:   begin
        !            98:     return v*a;
        !            99:   end "*";
        !           100:
        !           101:   function "*" ( v1,v2 : Vector ) return number is
        !           102:   begin
        !           103:     if v1'first /= v2'first or else v1'last /= v2'last
        !           104:      then raise CONSTRAINT_ERROR;
        !           105:      else declare
        !           106:             temp,sum : number;
        !           107:           begin
        !           108:             if v1'first <= v1'last
        !           109:              then sum := v1(v1'first)*v2(v2'first);
        !           110:                   for i in v1'first+1..v1'last loop
        !           111:                     temp := v1(i)*v2(i);
        !           112:                     Add(sum,temp);
        !           113:                     Clear(temp);
        !           114:                   end loop;
        !           115:             end if;
        !           116:             return sum;
        !           117:           end;
        !           118:     end if;
        !           119:   end "*";
        !           120:
        !           121:   function "*" ( v1,v2 : Vector ) return Vector is
        !           122:   begin
        !           123:     if v1'first /= v2'first or else v1'last /= v2'last
        !           124:      then raise CONSTRAINT_ERROR;
        !           125:      else declare
        !           126:             res : Vector(v1'range);
        !           127:           begin
        !           128:             for i in v1'range loop
        !           129:               res(i) := v1(i)*v2(i);
        !           130:             end loop;
        !           131:             return res;
        !           132:           end;
        !           133:     end if;
        !           134:   end "*";
        !           135:
        !           136:   function Sum ( v : Vector ) return number is
        !           137:
        !           138:     res : number := v(v'first);
        !           139:
        !           140:   begin
        !           141:     for i in v'first+1..v'last loop
        !           142:       Add(res,v(i));
        !           143:     end loop;
        !           144:     return res;
        !           145:   end Sum;
        !           146:
        !           147: -- ARITHMETIC AS PROCEDURES :
        !           148:
        !           149:   procedure Add ( v1 : in out Vector; v2 : in Vector ) is
        !           150:   begin
        !           151:     if v1'first /= v2'first or else v1'last /= v2'last
        !           152:      then raise CONSTRAINT_ERROR;
        !           153:      else for i in v1'range loop
        !           154:             Add(v1(i),v2(i));
        !           155:           end loop;
        !           156:     end if;
        !           157:   end Add;
        !           158:
        !           159:   procedure Min ( v : in out Vector ) is
        !           160:   begin
        !           161:     for i in v'range loop
        !           162:       Min(v(i));
        !           163:     end loop;
        !           164:   end Min;
        !           165:
        !           166:   procedure Sub ( v1 : in out Vector; v2 : in Vector ) is
        !           167:   begin
        !           168:     if v1'first /= v2'first or else v1'last /= v2'last
        !           169:      then raise CONSTRAINT_ERROR;
        !           170:      else for i in v1'range loop
        !           171:             Sub(v1(i),v2(i));
        !           172:           end loop;
        !           173:     end if;
        !           174:   end Sub;
        !           175:
        !           176:   procedure Mul ( v : in out Vector; a : in number ) is
        !           177:   begin
        !           178:     for i in v'range loop
        !           179:       Mul(v(i),a);
        !           180:     end loop;
        !           181:   end Mul;
        !           182:
        !           183:   procedure Mul ( v1 : in out Vector; v2 : in Vector ) is
        !           184:   begin
        !           185:     if v1'first /= v2'first or else v1'last /= v2'last
        !           186:      then raise CONSTRAINT_ERROR;
        !           187:      else for i in v1'range loop
        !           188:             Mul(v1(i),v2(i));
        !           189:           end loop;
        !           190:     end if;
        !           191:   end Mul;
        !           192:
        !           193: -- DESTRUCTOR :
        !           194:
        !           195:   procedure Clear ( v : in out Vector ) is
        !           196:   begin
        !           197:     for i in v'range loop
        !           198:       Clear(v(i));
        !           199:     end loop;
        !           200:   end Clear;
        !           201:
        !           202: -- OPERATIONS ON POINTERS TO VECTORS :
        !           203:
        !           204: -- COMPARISON AND COPYING :
        !           205:
        !           206:   function Equal ( v1,v2 : Link_to_Vector ) return boolean is
        !           207:   begin
        !           208:     if (v1 = null) and (v2 = null)
        !           209:      then return true;
        !           210:      elsif (v1 = null) or (v2 = null)
        !           211:          then return false;
        !           212:          else return Equal(v1.all,v2.all);
        !           213:     end if;
        !           214:   end Equal;
        !           215:
        !           216:   procedure Copy ( v1: in Link_to_Vector; v2 : in out Link_to_Vector ) is
        !           217:   begin
        !           218:     Clear(v2);
        !           219:     if v1 /= null
        !           220:      then v2 := new Vector(v1'range);
        !           221:           for i in v1'range loop
        !           222:             v2(i) := v1(i);
        !           223:           end loop;
        !           224:     end if;
        !           225:   end Copy;
        !           226:
        !           227: -- ARITHMETIC AS FUNCTIONS :
        !           228:
        !           229:   function "+" ( v1,v2 : Link_to_Vector ) return Link_to_Vector is
        !           230:   begin
        !           231:     if v1 = null
        !           232:      then return v2;
        !           233:      elsif v2 = null
        !           234:          then return v1;
        !           235:          else return new Vector'(v1.all + v2.all);
        !           236:     end if;
        !           237:   end "+";
        !           238:
        !           239:   function "+" ( v : Link_to_Vector ) return Link_to_Vector is
        !           240:   begin
        !           241:     if v = null
        !           242:      then return v;
        !           243:      else return new Vector'(+v.all);
        !           244:     end if;
        !           245:   end "+";
        !           246:
        !           247:   function "-" ( v : Link_to_Vector ) return Link_to_Vector is
        !           248:   begin
        !           249:     if v = null
        !           250:      then return v;
        !           251:      else return new Vector'(-v.all);
        !           252:     end if;
        !           253:   end "-";
        !           254:
        !           255:   function "-" ( v1,v2 : Link_to_Vector ) return Link_to_Vector is
        !           256:   begin
        !           257:     if v2 = null
        !           258:      then return v1;
        !           259:      elsif v1 = null
        !           260:          then return -v2;
        !           261:          else return new Vector'(v1.all - v2.all);
        !           262:     end if;
        !           263:   end "-";
        !           264:
        !           265:   function "*" ( v : Link_to_Vector; a : number ) return Link_to_Vector is
        !           266:   begin
        !           267:     if v = null
        !           268:      then return null;
        !           269:      else return new Vector'(v.all*a);
        !           270:     end if;
        !           271:   end "*";
        !           272:
        !           273:   function "*" ( a : number; v : Link_to_Vector ) return Link_to_Vector is
        !           274:   begin
        !           275:     return v*a;
        !           276:   end "*";
        !           277:
        !           278:   function "*" ( v1,v2 : Link_to_Vector ) return number is
        !           279:   begin
        !           280:     return v1.all*v2.all;
        !           281:   end "*";
        !           282:
        !           283:   function "*" ( v1,v2 : Link_to_Vector ) return Link_to_Vector is
        !           284:   begin
        !           285:     if (v1 = null) or (v2 = null)
        !           286:      then return null;
        !           287:      else return new Vector'(v1.all*v2.all);
        !           288:     end if;
        !           289:   end "*";
        !           290:
        !           291:   function Sum ( v : Link_to_Vector ) return number is
        !           292:   begin
        !           293:     return Sum(v.all);
        !           294:   end Sum;
        !           295:
        !           296: -- ARITHMETIC AS PROCEDURES :
        !           297:
        !           298:   procedure Add ( v1 : in out Link_to_Vector; v2 : in Link_to_Vector ) is
        !           299:   begin
        !           300:     if v2 = null
        !           301:      then null;
        !           302:      elsif v1 = null
        !           303:          then Copy(v2,v1);
        !           304:          else Add(v1.all,v2.all);
        !           305:     end if;
        !           306:   end Add;
        !           307:
        !           308:   procedure Min ( v : in out Link_to_Vector ) is
        !           309:   begin
        !           310:     if v = null
        !           311:      then null;
        !           312:      else Min(v.all);
        !           313:     end if;
        !           314:   end Min;
        !           315:
        !           316:   procedure Sub ( v1 : in out Link_to_Vector; v2 : in Link_to_Vector ) is
        !           317:   begin
        !           318:     if v2 = null
        !           319:      then null;
        !           320:      elsif v1 = null
        !           321:          then v1 := new Vector'(v2.all);
        !           322:               Min(v1.all);
        !           323:          else Sub(v1.all,v2.all);
        !           324:     end if;
        !           325:   end Sub;
        !           326:
        !           327:   procedure Mul ( v : in out Link_to_Vector; a : in number ) is
        !           328:   begin
        !           329:     if v /= null
        !           330:      then Mul(v.all,a);
        !           331:     end if;
        !           332:   end Mul;
        !           333:
        !           334:   procedure Mul ( v1 : in out Link_to_Vector; v2 : in Link_to_Vector ) is
        !           335:   begin
        !           336:     if v2 = null
        !           337:      then null;
        !           338:      elsif v1 = null
        !           339:          then Clear(v1);
        !           340:          else Mul(v1.all,v2.all);
        !           341:     end if;
        !           342:   end Mul;
        !           343:
        !           344: -- DESTRUCTOR :
        !           345:
        !           346:   procedure Clear ( v : in out Link_to_Vector ) is
        !           347:
        !           348:     procedure free is new unchecked_deallocation(Vector,Link_to_Vector);
        !           349:
        !           350:   begin
        !           351:     if v /= null
        !           352:      then Clear(v.all);
        !           353:           free(v);
        !           354:     end if;
        !           355:   end Clear;
        !           356:
        !           357: end Generic_Vectors;

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>