Перейти к содержимому


Фотография
- - - - -

Кто как программирует


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 108

#1 Subj

Subj

    Useful

  • Почетный житель
  • 806 сообщений

Отправлено 30.10.2004, 19:45

В общем такая тема. Дана задача (эт сам придумал): Нарисовать два прямоугольника, один внешний, другой внутренний и поставить между ними точку в левом верхнем углу. Осуществить управление этой точкой курсорными или другими клавишами в четырех направлениях. Число возможных позиций остановки точки в обеих координатах равно четырем. Движение точки должно ограничиваться прямоугольниками. В целом что-то вроде лабиринта. Что от Вас требуется: Реализовать задачу программным путем. Не важно, на чем Вы программируете, да и задача простецкая, просто хочется увидить, как это у Вас получиться и как это будет выглядеть для разных языков. Желательно все сделать как можно проще, но в тоже время не теряя своего почерка.
Building better software with Ada

#2 Subj

Subj

    Useful

  • Почетный житель
  • 806 сообщений

Отправлено 30.10.2004, 19:47

Вот как это сделал я на Delphi7: //Главный модуль unit Unit1; interface uses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,   Dialogs, StdCtrls, ExtCtrls; type  TForm1 = class(TForm)    pix: TPanel;//размеры: 10 на 10 черного цвета    procedure FormPaint(Sender: TObject);    procedure FormActivate(Sender: TObject);    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);  private    { Private declarations }  public    { Public declarations }  end; var  Form1: TForm1;  ktx,kty:byte;//Возможные позиции точки const  mktxy:array[1..4] of byte=(70,120,170,220);//Массив Возможных координат точки. implementation {$R *.dfm} //Процедура перерисовки формы, вызываемая также при загрузке procedure TForm1.FormPaint(Sender: TObject); begin //Рисуем два прямоугольника with Form1.Canvas do begin Rectangle(50,50,250,250); Rectangle(100,100,200,200); end; end; //Загрузка формы procedure TForm1.FormActivate(Sender: TObject); begin //Начальная позиция: 1,1 ktx:=1; kty:=1; //Ставим pix:TPanel (выступает в качестве точки) в соответствии с текущей позицией pix.Left:=mktxy[ktx]; pix.Top:=mktxy[kty]; end; //Событие нажатия клавиши из возможных: //KeyDown; KeyPress; KeyUp procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;  Shift: TShiftState); begin case byte(key) of 37:if (ktx>1) and ((kty=1) or (kty=4)) then ktx:=ktx-1;//Стрелка влево 38:if (kty>1) and ((ktx=1) or (ktx=4)) then kty:=kty-1;//Стрелка вверх 39:if (ktx<4) and ((kty=1) or (kty=4)) then ktx:=ktx+1;//Стрелка вправо 40:if (kty<4) and ((ktx=1) or (ktx=4)) then kty:=kty+1;//Стрелка вниз end; pix.Left:=mktxy[ktx]; pix.Top:=mktxy[kty]; end; end. Конечно это не единственный вариант, но оставлю так как есть. Слово за Вами...
Building better software with Ada

#3 true

true

    Небожитель

  • Небожитель
  • PipPipPipPipPipPip
  • 11 667 сообщений

Отправлено 30.10.2004, 20:45

саму задачу решать не буду - у меня на с++ слишком геморно все это с нуля написать  :)... ну а так как ты хотел увидеть кто как программирует, то на теме кусок моего кода

#ifndef RESOURCEMANAGER_H
#define RESOURCEMANAGER_H

#include <map>
#include <string>
#include "image.h"

template <class T, class R> class CResourceManager
{
public:

  typedef std::map<std::string, T> resources;
  typedef typename std::map<std::string, T>::iterator resource_iterator;

  CResourceManager()
  {
    
  };
  
  virtual ~CResourceManager()
  {
    for (resource_iterator i = m_Resources.begin(); i != m_Resources.end(); ++i)
      m_Resources.erase(i);
  };

  R Add(const std::string &szFilename)
  {
    resource_iterator i = m_Resources.find(szFilename);

    if (i != m_Resources.end())
    {
      i->second.AddReference();
      return i->second.GetData();
    }

    T resource;
    resource.Load(szFilename);
    resource.AddReference();
       
    m_Resources[szFilename] = resource;
    
    return resource.GetData(); 
  };
  
  int Remove(const std::string &szFilename)
  {
    resource_iterator i = m_Resources.find(szFilename);
   
    if (i != m_Resources.end())
    {
      i->second.RemoveReference();
      
      if (!i->second.GetReferenceCount())
        m_Resources.erase(i);
    }

    return 0;   
  };

protected:
  resources m_Resources;
  
};

этот кусок управляет разнообразными ресурсами в моей программе

С приходом опыта многие задачи становятся нам не только по плечу, но и глубоко по %%%.

#4 Subj

Subj

    Useful

  • Почетный житель
  • 806 сообщений

Отправлено 30.10.2004, 20:53

Попытаюсь понять в будущем, что тут и с чем едят
Building better software with Ada

#5 Subj

Subj

    Useful

  • Почетный житель
  • 806 сообщений

Отправлено 30.10.2004, 21:04

Да и вообще, не будем ограничиваться этой задачей. Предлагайте другие, поинтереснее
Building better software with Ada

#6 Subj

Subj

    Useful

  • Почетный житель
  • 806 сообщений

Отправлено 30.10.2004, 21:55

Чтобы быть до конца откровенным, выражение pix.Left:=mktxy[ktx]; pix.Top:=mktxy[kty]; нужно осуществить в виде отдельной процедуры, поскольку при расширении программы оно будет встречаться все чаще, да и выглядеть будет все более громоздко.
Building better software with Ada

#7 holy666

holy666

    Дохлый Суслег (ex-Директор зоопарка)

  • Почетный житель
  • 3 303 сообщений

Отправлено 30.10.2004, 22:13

с нетерпением ждем решения на ЯВЕ...
Убиваю сусликов. Быстро и недорого.

#8 Гость_MindKiller_*

Гость_MindKiller_*
  • Гость

Отправлено 30.10.2004, 22:18

template <class T, class R> class CResourceManager
{
public:

 typedef std::map<std::string, T> resources;
 typedef typename resources::iterator resource_iterator;

вот так читабельность кода могла бы возрасти :)


#9 Гость_MindKiller_*

Гость_MindKiller_*
  • Гость

Отправлено 30.10.2004, 22:25

const std::string &szFilename

а что std::string теперь Zero-Terminated ? :)


#10 Гость_MindKiller_*

Гость_MindKiller_*
  • Гость

Отправлено 30.10.2004, 22:30

 int Remove(const std::string &szFilename)
 {
   resource_iterator i = m_Resources.find(szFilename);
 
   if (i != m_Resources.end())
   {
     i->second.RemoveReference();
     
     if (!i->second.GetReferenceCount())
       m_Resources.erase(i);
   }
   return 0;  
 };

было бы логичнее переписать этот метод вот так:

 void Remove(const std::string &sFilename){
   resource_iterator i = m_Resources.find(sFilename);
 
   if (i != m_Resources.end()){
     i->second.RemoveReference();     
     if (!i->second.GetReferenceCount())
       m_Resources.erase(i);
   }
 };



#11 Subj

Subj

    Useful

  • Почетный житель
  • 806 сообщений

Отправлено 30.10.2004, 22:35

Для наглядности смотрите Пример
Building better software with Ada

#12 Кот Баюн

Кот Баюн

    активен

  • Небожитель
  • PipPipPipPipPipPip
  • 10 444 сообщений

Отправлено 31.10.2004, 01:34

Вот так на Java согласно всем канонам "хорошего тона":
package floresiris.prototypes;
/**
 * Проект: floresiris
 * Описание: Отображение.
 * Подробности: View из паттерна Model-View-Controller
 * Copyright (c) 2004 iZEN
 * @(#)View.java
 * 30.10.2004-30.10.2004
 */
/**
 * @author iZEN
 *
 * TODO To change the template for this generated type comment go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
public interface View {
    void refresh();
}
package floresiris.prototypes;
/**
 * Проект: floresiris
 * Описание: Контроллёр.
 * Подробности: Паттерн MVC (Model-View-Controller)
 * Copyright (c) 2004 iZEN
 * @(#)Controller.java
 * 31.10.2004-31.10.2004
 */
/**
 * Контроллёр событий.
 * @author iZEN
 */
public interface Controller {
    void notifyEvent(Object event);
}
package floresiris.prototypes;
/**
 * Проект: floresiris
 * Описание: Ко*цензура*.
 * Подробности: Ко*цензура* для управления (без Undo/Redo)
 * Copyright (c) 2004 iZEN
 * @(#)Command.java
 * 31.10.2004-31.10.2004
 */
/**
 * Ко*цензура* для управления (без Undo/Redo)
 * @author iZEN
 */
public interface Command {
    void doIt();
}
package floresiris.prototypes;
/**
 * Проект: floresiris
 * Описание: Место.
 * Подробности: Место.
 * Copyright (c) 2004 iZEN
 * @(#)Place.java
 * 30.10.2004-30.10.2004
 */
/**
 * Место.
 * @author iZEN
 */
public interface Place {
    void accept(Visitor visitor);
}
package floresiris.prototypes;
/**
 * Проект: floresiris
 * Описание: Visitor
 * Подробности: Визитёр
 * Copyright (c) 2004 iZEN
 * @(#)Visitor.java
 * 30.10.2004-31.10.2004
 */
/**
 * Визитёр
 * @author iZEN
 */
public interface Visitor {
    void visit(Place place) throws VisitException;
}
package floresiris.prototypes;
/**
 * Проект: floresiris
 * Описание: Исключение.
 * Подробности: Исключение, возникающее при невозможности нанести визит.
 * Copyright (c) 2004 iZEN
 * @(#)VisitException.java
 * 31.10.2004-31.10.2004
 */
/**
 * Исключение, возникающее при невозможности нанести визит.
 * (Паттерн Visitor)
 * @author iZEN
 *
 */
public class VisitException extends Exception {}
package floresiris.labirint;
/**
 * Проект: labirint
 * Описание: Лабиринт.
 * Подробности: Лабиринт с картой.
 * Copyright (c) 2004 iZEN
 * @(#)LabirintModel.java
 * 30.10.2004-31.10.2004
 */
import floresiris.prototypes.*;
/**
 * Лабиринт с картой.
 * @author iZEN
 */
public class LabirintModel implements Place {
    private View view;
    /**
     * Карта лабиринта
     * 1####
     * #   #
     * # # #
     * #   #
     * ####9
     */
    private final char[][] map = new char[][] { {'1', '#', '#', '#', '#'},
        {'#', ' ', ' ', ' ', '#'}, {'#', ' ', '#', ' ', '#'},
        {'#', ' ', ' ', ' ', '#'}, {'#', '#', '#', '#', '9'}};
    /**
     * Метод исключает нахождение двух путников (если такие потребуются) одновременно в одном месте.
     * @see floresiris.prototypes.Place#accept(floresiris.prototypes.Visitor)
     */
    public synchronized void accept(Visitor visitor) {
        try {
            visitor.visit(this);
        } catch (VisitException ex) {
            System.err.println("No Move!");
        } finally {
            view.refresh();
        }
    }
    /**
     * @return Returns the view.
     */
    public View getView() {
        return view;
    }
    /**
     * @param view The view to set.
     */
    public void setView(View view) {
        this.view = view;
    }
    /**
     * @return Returns the map.
     */
    public char[][] getMap() {
        return map;
    }
}
package floresiris.labirint;
/**
 * Проект: labirint
 * Описание: Путник.
 * Подробности: (Ничего личного).
 * Copyright (c) 2004 iZEN
 * @(#)Travellier.java
 * 30.10.2004-31.10.2004
 */
import floresiris.prototypes.*;
/**
 * Путник.
 * (Ничего личного кроме собственных координат).
 * @author iZEN
 */
public class Travellier implements Visitor {
    /**
     * Координаты путника
     */
    private int x = 1, y = 1;//Левый верхний угол - все координаты с 0
    private int dx, dy;//Отклонение от курса
    private Command upCommand = new Command() {
        public void doIt() {
            dx = 0;
            dy = -1;
        }
    };
    private Command downCommand = new Command() {
        public void doIt() {
            dx = 0;
            dy = 1;
        }
    };
    private Command leftCommand = new Command() {
        public void doIt() {
            dx = -1;
            dy = 0;
        }
    };
    private Command rightCommand = new Command() {
        public void doIt() {
            dx = 1;
            dy = 0;
        }
    };
    /**
     * @return Returns the x.
     */
    public int getX() {
        return x;
    }
    /**
     * @return Returns the y.
     */
    public int getY() {
        return y;
    }
    /**
     * @see floresiris.prototypes.Visitor#visit(floresiris.prototypes.Place)
     */
    public void visit(Place place) throws VisitException {
        LabirintModel labirint = (LabirintModel)place;
        char[][] map = labirint.getMap();
        if (map[x + dx][y + dy] != '#') {
            x += dx;
            y += dy;
        } else
            throw new VisitException();
    }
    /**
     * @return UPCommand
     */
    public Command getUpCommand() {
        return upCommand;
    }
    /**
     * @return DOWNCommand
     */
    public Command getDownCommand() {
        return downCommand;
    }
    /**
     * @return LEFTCommand
     */
    public Command getLeftCommand() {
        return leftCommand;
    }
    /**
     * @return RIGHTCommand
     */
    public Command getRightCommand() {
        return rightCommand;
    }
}
package floresiris.labirint.ui;
/**
 * Проект: labirint
 * Описание:
 * Подробности:
 * Copyright (c) 2004 iZEN
 * @(#)LabirintController.java
 * 31.10.2004-31.10.2004
 */
import floresiris.labirint.LabirintModel;
import floresiris.labirint.Travellier;
import floresiris.prototypes.Controller;
import java.awt.event.*;
/**
 * @author iZEN
 */
public class LabirintController implements Controller {
    private LabirintModel labirint;
    private Travellier travellier;
    private LabirintFrame frame;
    /**
     * Конструктор
     */
    public LabirintController(LabirintModel labirint, Travellier travellier, LabirintFrame labirintFrame) {
        super();
        this.labirint = labirint;
        this.travellier = travellier;
        this.frame = labirintFrame;
    }
    /**
     * @see floresiris.prototypes.Controller#notifyEvent(java.lang.Object)
     */
    public void notifyEvent(Object event) {
        ActionEvent e = (ActionEvent)event;
        if (e.getSource() == frame.getUpButton())
            travellier.getUpCommand().doIt();
        else if (e.getSource() == frame.getDownButton())
            travellier.getDownCommand().doIt();
        else if (e.getSource() == frame.getLeftButton())
            travellier.getLeftCommand().doIt();
        else if (e.getSource() == frame.getRightButton())
            travellier.getRightCommand().doIt();
        else
            return;
        labirint.accept(travellier);
    }
}
package floresiris.labirint.ui;
/**
 * Проект: labirint
 * Описание: Формачка с кнопачками.
 * Подробности: Нажимаете на кнопочки - в консоли смотрите результат.;))
 * Copyright (c) 2004 iZEN
 * @(#)LabirintFrame.java
 * 30.10.2004-31.10.2004
 */
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import floresiris.labirint.LabirintModel;
import floresiris.labirint.Travellier;
import floresiris.prototypes.View;
import floresiris.prototypes.Controller;
/**
 * Формачка с кнопачками.
 * Нажимаете на кнопочки - в консоли смотрите результат.;))
 * А кому сейчас легко?;)))
 * @author iZEN
 */
public class LabirintFrame extends JFrame implements View, ActionListener {
    private LabirintModel labirint;
    private Travellier travellier;
    private Controller controller;
    private JButton upButton = new JButton("Up");
    private JButton downButton = new JButton("Down");
    private JButton leftButton = new JButton("Left");
    private JButton rightButton = new JButton("Right");
    /**
     * @return Returns the downButton.
     */
    public JButton getDownButton() {
        return downButton;
    }
    /**
     * @return Returns the leftButton.
     */
    public JButton getLeftButton() {
        return leftButton;
    }
    /**
     * @return Returns the rightButton.
     */
    public JButton getRightButton() {
        return rightButton;
    }
    /**
     * @return Returns the upButton.
     */
    public JButton getUpButton() {
        return upButton;
    }
    /**
     * @return Returns the controller.
     */
    public Controller getController() {
        return controller;
    }
    /**
     * @param controller The controller to set.
     */
    public void setController(Controller controller) {
        this.controller = controller;
    }
    /**
     * @param title
     */
    public LabirintFrame(String title) {
        super(title);
        createGui();
        this.setVisible(true);
    }
    /**
     * @return Returns the model.
     */
    public LabirintModel getLabirint() {
        return labirint;
    }
    /**
     * @param model The model to set.
     */
    public void setLabirint(LabirintModel model) {
        this.labirint = model;
    }
    /**
     * @return Returns the travellier.
     */
    public Travellier getTravellier() {
        return travellier;
    }
    /**
     * @param travellier The travellier to set.
     */
    public void setTravellier(Travellier travellier) {
        this.travellier = travellier;
    }
    protected void createGui() {
        this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        Dimension dim = new Dimension(100, 100);
        this.setSize(dim);
        Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
        int x = (screen.width - dim.width) / 2;
        int y = (screen.height - dim.height) / 2;
        this.setLocation(x, y);
        this.getContentPane().setLayout(new BorderLayout());
        this.getContentPane().add(upButton, BorderLayout.NORTH);
        this.getContentPane().add(downButton, BorderLayout.SOUTH);
        this.getContentPane().add(leftButton, BorderLayout.WEST);
        this.getContentPane().add(rightButton, BorderLayout.EAST);
        upButton.addActionListener(this);
        downButton.addActionListener(this);
        leftButton.addActionListener(this);
        rightButton.addActionListener(this);
    }
    /**
     * Отобразить лабиринт и всё, что в нём находится.
     * @see floresiris.prototypes.View#refresh()
     */
    public void refresh() {
        // TODO Auto-generated method stub
        int xt = travellier.getX();
        int yt = travellier.getY();
        char[][] map = labirint.getMap();
        System.out.println("Next Step:");
        for (int y = 0; y < map.length; y++) {
            for (int x = 0; x < map[y].length; x++)
                if ((xt == x) && (yt == y))
                    System.out.print('A');//Путник
                else
                    System.out.print(map[y][x]);//Пространство лабиринта
            System.out.println();
        }
    }
    /**
     * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
     */
    public void actionPerformed(ActionEvent e) {
        controller.notifyEvent(e);
    }
}
package floresiris.labirint;
/**
 * Проект: labirint
 * Описание: Приложение лабиринта.
 * Подробности: Главный класс приложения.
 * Copyright (c) 2004 iZEN
 * @(#)Labirint.java
 * 30.10.2004-31.10.2004
 */
import floresiris.labirint.ui.*;
/**
 * Приложение лабиринта.
 * @author iZEN
 */
public class Labirint {
    public static void main(String[] args) {
        LabirintFrame labirintFrame = new LabirintFrame("Простой лабиринт");
        LabirintModel labirint = new LabirintModel();
        labirint.setView(labirintFrame);
        Travellier travellier = new Travellier();
        labirintFrame.setLabirint(labirint);
        labirintFrame.setTravellier(travellier);
        LabirintController labirintController = new LabirintController(labirint, travellier, labirintFrame);
        labirintFrame.setController(labirintController);
        labirintFrame.refresh();
    }
}
 :D  :D  :D


„Именно в интуиции нам является сущность бытия как мировая воля, как единое метафизическое начало мира, которое раскрывает себя в многообразии случайных проявлений“

#13 Кот Баюн

Кот Баюн

    активен

  • Небожитель
  • PipPipPipPipPipPip
  • 10 444 сообщений

Отправлено 31.10.2004, 01:38

Проект (исходники+приложение) будет находиться здесь:
http://izen.dev.juga...ds/labirint.zip
(16 377 байт)


„Именно в интуиции нам является сущность бытия как мировая воля, как единое метафизическое начало мира, которое раскрывает себя в многообразии случайных проявлений“

#14 true

true

    Небожитель

  • Небожитель
  • PipPipPipPipPipPip
  • 11 667 сообщений

Отправлено 31.10.2004, 10:11

const std::string &szFilename

а что std::string теперь Zero-Terminated ? :)

const std::string  :D
у меня туда передаются только обычные строки типа "xmls/desc01.xml"

С приходом опыта многие задачи становятся нам не только по плечу, но и глубоко по %%%.

#15 true

true

    Небожитель

  • Небожитель
  • PipPipPipPipPipPip
  • 11 667 сообщений

Отправлено 31.10.2004, 10:15

template <class T, class R> class CResourceManager
{
public:

 typedef std::map<std::string, T> resources;
 typedef typename resources::iterator resource_iterator;

вот так читабельность кода могла бы возрасти :)

это да - исправил у себя
С приходом опыта многие задачи становятся нам не только по плечу, но и глубоко по %%%.

#16 true

true

    Небожитель

  • Небожитель
  • PipPipPipPipPipPip
  • 11 667 сообщений

Отправлено 31.10.2004, 10:17


int Remove(const std::string &szFilename)
{
  resource_iterator i = m_Resources.find(szFilename);
 
  if (i != m_Resources.end())
  {
    i->second.RemoveReference();
   
    if (!i->second.GetReferenceCount())
      m_Resources.erase(i);
  }
  return 0;  
};

было бы логичнее переписать этот метод вот так:

void Remove(const std::string &sFilename){
  resource_iterator i = m_Resources.find(sFilename);
 
  if (i != m_Resources.end()){
    i->second.RemoveReference();    
    if (!i->second.GetReferenceCount())
      m_Resources.erase(i);
  }
};

не обязательно - так как классы довольно часто модификируются - я отсвляю это для того чтоб много не переписывать - если захочется какое нить значение вернуть....

кстати в код есть одно тупое место, но я его опять таки уже исправил у себя

С приходом опыта многие задачи становятся нам не только по плечу, но и глубоко по %%%.

#17 Гость_MindKiller_*

Гость_MindKiller_*
  • Гость

Отправлено 31.10.2004, 12:25

const std::string &szFilename

а что std::string теперь Zero-Terminated ? :)

const std::string  :D
у меня туда передаются только обычные строки типа "xmls/desc01.xml"

не, ты не понял, в венгерке sz - это string zero, а std::string не zero-terminated.
это ерунда разумеется, просто взгляд остановился на этом месте :)
LPCTSTR - вот точно SZ


#18 Гость_MindKiller_*

Гость_MindKiller_*
  • Гость

Отправлено 31.10.2004, 12:34

ну раз тут все кодом светят :)
//
//	Threading models (MT/ST)
//

#ifndef threading_h
#define threading_h

#include "platform.h"
namespace wlib{
	
//
//
//
template <typename LockClass = mutex> class scoped_lock{
public:
	scoped_lock(LockClass& locker) : m_lock(locker){
		m_lock.lock();
	}
	~scoped_lock(){
		m_lock.unlock();
	}
private:
	LockClass&	m_lock;
};

//
//	Cross-platform mutex class
//  Available platforms: POSIX, Win32
//
class mutex{
public:
	mutex();
	virtual ~mutex();

	void	lock();
	void	unlock();
public:
	typedef scoped_lock<mutex> Lock;
private:
	MUTEX_HANDLE	m_handle;
};

//
//	Mutex-Stub
//  it's helpful in owning policy
//
class mutex_stub{
public:
	void lock(){}
	void unlock(){}
};


//
//	lockable class
//	can be used to lock STL containers
//
template <typename BaseClass, typename LockClass = mutex> class lockable : public BaseClass, LockClass{};

//
//	atomic_act
//
class AtomicCounter{
public:
	void inc(long& lval);
	void dec(long& lval);
private:
#ifdef WLIB_POSIX
	static mutex	m_monitor;
#endif
};

class helper_lock{
public:
	helper_lock(mutex& locker) : m_lock(locker){
		m_lock.lock();
	}
	~helper_lock(){
		m_lock.unlock();
	}
	
	bool condition() { return m_bCondition; }
	void iterate() { m_bCondition = false; }
private:
	mutex&	m_lock;
	bool m_bCondition;
};
// 
//	synchronized() macros
//	perfect java-like hack;)
//
#define synchronized(_s) if(false); else for(helper_lock _s##lock_class(_s); _s##lock_class.condition(); _s##lock_class.iterate())

class Monitor{
public:
	class TimeOutException : public std::exception{
	   	 virtual char const * what() const throw(){
			return "Monitor::TimeOutException";
		}

	};

	Monitor();
	~Monitor();
	void acquire();
	void release();

	void wait();
	void wait(size_t nMilliseconds);
	void notify();

private:
#ifdef WLIB_WIN32
	CRITICAL_SECTION  m_criticalSection;
	HANDLE            m_hEvent;
#elif WLIB_POSIX
	pthread_mutex_t m_mutex;
	pthread_cond_t  m_condition;
#else
	#error unknown configuration
#endif

};

}; //namespace
#endif //threading_h

#ifndef shared_h
#define shared_h
 
#include "exceptions.h"
#include "threading.h"

namespace wlib{

template <typename T, typename S> class LockingProxy{
public:
	LockingProxy(T* p, S* sync) : m_pointee(p), m_syncronizer(sync){
		m_syncronizer->lock();
	}
	~LockingProxy(){
		m_syncronizer->unlock();
	}

	T* operator->() const throw()   {
		return m_pointee;
	}
private:
	T*	m_pointee;
	S*	m_syncronizer;
};

// helpers
namespace Access{
	class Exclusive : public mutex{};
	class NonExclusive : public mutex_stub {};
}

template <typename T, typename Access = Access::NonExclusive> class ref{
public:
    typedef T element_type;
	
    explicit ref(T* p = 0) : m_pRefCnt(0){
		if (p) 
			m_pRefCnt = new refcount(p);
	}

    ~ref(){
		release();
	}
	
    ref(const ref& r) throw(){
		acquire(r.m_pRefCnt);
	}

    ref& operator=(const ref& r){
        if (this != &r) {
            release();
            acquire(r.m_pRefCnt);
        }
        return *this;
    }
		
    T& operator*()  const throw()   {return *m_pRefCnt->m_pointee;}
    LockingProxy<T,Access> operator->() const throw()   {return LockingProxy<T,Access>(m_pRefCnt->m_pointee, &m_pRefCnt->m_sync);}
    T* get()        const throw()   {return m_pRefCnt ? m_pRefCnt->m_pointee : 0;}
    operator T* () const {
		return get();
    }
    bool unique()   const throw() {
		return (m_pRefCnt ? m_pRefCnt->m_count == 1 : true);
	}
	
private:	
    struct refcount {
        refcount(T* p = 0, long initial_count = 1) : m_pointee(p), m_count(initial_count){
		}

        T*          m_pointee;
        long		m_count;
		AtomicCounter	m_atom;
		Access		m_sync;
    };
	struct refcount*	m_pRefCnt;
	
    void acquire(refcount* c) throw(){ 
        m_pRefCnt = c;
		if (c) 
			c->m_atom.inc(c->m_count);
    }
	
    void release(){
        if (m_pRefCnt) {
			m_pRefCnt->m_atom.dec(m_pRefCnt->m_count);
            if (m_pRefCnt->m_count == 0) {
                delete m_pRefCnt->m_pointee;
                delete m_pRefCnt;
            }
            m_pRefCnt = 0;
        }
    }
};

}
#endif


#19 Гость_MindKiller_*

Гость_MindKiller_*
  • Гость

Отправлено 31.10.2004, 12:41

ууу как тут с форматированием весело :)

#20 Кот Баюн

Кот Баюн

    активен

  • Небожитель
  • PipPipPipPipPipPip
  • 10 444 сообщений

Отправлено 31.10.2004, 15:23

<off>

ууу как тут с форматированием весело :)

Я из редактора Eclipse Copy/Paste исходников делал. Разве VS такого не даёт? :)
А вообще, подсветка синтаксиса не помешала бы, как на RSDN сделали...
</off>


„Именно в интуиции нам является сущность бытия как мировая воля, как единое метафизическое начало мира, которое раскрывает себя в многообразии случайных проявлений“




Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 скрытых пользователей