summaryrefslogtreecommitdiff
path: root/libs/cassowary/ClSymbolicWeight.cc
blob: 9dddaa59497d3572f5e43c5d919cb20e7d42aec6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
// $Id$
//
// Cassowary Incremental Constraint Solver
// Original Smalltalk Implementation by Alan Borning
// This C++ Implementation by Greg J. Badros, <gjb@cs.washington.edu>
// http://www.cs.washington.edu/homes/gjb
// (C) 1998, 1999 Greg J. Badros and Alan Borning
// See ../LICENSE for legal details regarding this software
//
// ClSymbolicWeight.cc

#include <cassowary/Cassowary.h>
#include <cassowary/ClSymbolicWeight.h>

#ifdef HAVE_CONFIG_H
#include <config.h>
#define CONFIG_H_INCLUDED
#endif

// Help g++ out, tell it to instantiate this
//template vector<double> &vector<double>::operator =(const vector<double> &);

ClSymbolicWeight::ClSymbolicWeight(unsigned int CLevels, double value) :
  _values(CLevels, value)
{ 
  assert(_values.size() == CLevels);
}

ClSymbolicWeight::ClSymbolicWeight(double w1, double w2, double w3)
{
  _values.push_back(w1);
  _values.push_back(w2);
  _values.push_back(w3);
  assert(_values.size() == 3);
}

ClSymbolicWeight::ClSymbolicWeight(const vector<double> &weights) :
  _values(weights)
{ }

ClSymbolicWeight &
ClSymbolicWeight::Zero()
{
  static ClSymbolicWeight Zero(0.0, 0.0, 0.0);
  return Zero;
}


ClSymbolicWeight &
ClSymbolicWeight::negated()
{
  vector<double>::iterator it = _values.begin();
  for (; it != _values.end(); ++it)
    {
    *it = -*it;
    }
  return *this;
}

ClSymbolicWeight &
ClSymbolicWeight::MultiplyMe(Number n)
{
  vector<double>::iterator it = _values.begin();
  for (; it != _values.end(); ++it)
    {
    *it *= n;
    }
  return *this;
}


ClSymbolicWeight 
ClSymbolicWeight::DivideBy(Number n) const
{
  assert(n!=0);
  ClSymbolicWeight clsw(0);
  vector<double>::const_iterator i = _values.begin();
  for (; i != _values.end(); ++i)
    {
    clsw.push_back(*i / n);
    }
  return clsw;
}

ClSymbolicWeight &
ClSymbolicWeight::addtoMe(const ClSymbolicWeight &cl)
{
  assert(cl.CLevels() == CLevels());

  vector<double>::iterator i1 = _values.begin();
  vector<double>::const_iterator i2 = cl._values.begin();
  for (; i1 != _values.end(); ++i1, ++i2)
    {
    *i1 += *i2;
    }
  return *this;
}

ClSymbolicWeight 
ClSymbolicWeight::Subtract(const ClSymbolicWeight &cl) const
{
  assert(cl.CLevels() == CLevels());

  ClSymbolicWeight clsw(0);
  vector<double>::const_iterator i1 = _values.begin();
  vector<double>::const_iterator i2 = cl._values.begin();
  for (; i1 != _values.end(); ++i1, ++i2)
    {
    clsw.push_back(*i1 - *i2);
    }
  return clsw;
}


bool 
ClSymbolicWeight::lessThan(const ClSymbolicWeight &cl) const
{
  return _values < cl._values;
}

bool 
ClSymbolicWeight::lessThanOrEqual(const ClSymbolicWeight &cl) const
{
  return _values <= cl._values;
}

bool 
ClSymbolicWeight::equal(const ClSymbolicWeight &cl) const
{
  return _values == cl._values;
}

bool 
ClSymbolicWeight::greaterThan(const ClSymbolicWeight &cl) const
{
  return _values > cl._values;
}

bool 
ClSymbolicWeight::greaterThanOrEqual(const ClSymbolicWeight &cl) const
{
  return _values >= cl._values;
}

bool 
ClSymbolicWeight::isNegative() const
{
  return _values < Zero()._values;
}